2015-06-10 2 views
0

Я пытаюсь добавить функциональность в scala.collection.Iterable trait, а точнее, функцию printate, которая выполняет итерацию через элементы и выводит их (на консоль, если есть нет параметров, в противном случае для параметра выходного потока). Я использую предопределенный метод расширения, который я создал для объекта, printSelf(). Однако это вызывает ошибку компилятора: «Значение printSelf не является членом параметра типа Object». Я также хотел бы иметь это отдельный файл, так что мне легко использовать несколько проектов и приложений.Scala Неявное преобразование типов классов с параметрами типа

Вот мой текущий код для моего файла преобразования:

import java.io.OutputStream 
import scala.collection.Iterable 

package conversion{ 
    class Convert { 
    implicit def object2SuperObject(o:Object) = new ConvertObject(o) 
    implicit def iterable2SuperIterable[Object](i:Iterable[Object]) = new ConvertIterable[Object](i) 
    } 
    class ConvertObject(o:Object){ 
    def printSelf(){ 
     println(o.toString()) 
    } 
    def printSelf(os:OutputStream){ 
     os.write(o.toString().getBytes()) 
    } 
    } 
    class ConvertIterable[Object](i:Iterable[Object]){ 
    def printerate(){ 
     i.foreach {x => x.printSelf() } 
    } 
    def printerate(os:OutputStream){ 
     i.foreach { x => x.printSelf(os) } 
    } 
    } 
} 

Я также получаю подобную ошибку в коде, который пытается проверить это, «значение printerate не является членом scala.collection. immutable.Range ':

import conversion.Convert 
package test { 
    object program extends App { 
    new testObj(10) test 
    } 
    class testObj(i: Integer) { 
    def test(){ 
     val range = 0.until(i) 
     0.until(i).printerate() 
    } 
    } 
} 

Что случилось с тем, как я приближаюсь к преобразованию этого типа?

+0

В стиле записки, рассмотреть вопрос об использовании неявных классов вместо объекта с неявными DEFS: HTTP: //docs.scala- lang.org/overviews/core/implicit-classes.html. – Gal

ответ

2

Несколько вещей на самом деле:

  1. Преобразовать должен быть объект, а не класс.
  2. Вы можете использовать объект вместо любого
  3. Вы используете объект в качестве общего идентификатора типа, а гораздо менее запутанным Т.
  4. Вы не импортируют неявных определений (это не достаточно, чтобы импортировать сам объект).

Это должно работать:

package conversion { 
    object Convert { 
    implicit def object2SuperObject(o: Any) = new ConvertObject(o) 
    implicit def iterable2SuperIterable[T](i:Iterable[T]) = new ConvertIterable[T](i) 
    } 
    class ConvertObject(o: Any){ 
    def printSelf(){ 
     println(o.toString()) 
    } 
    def printSelf(os:OutputStream){ 
     os.write(o.toString().getBytes()) 
    } 
    } 
    class ConvertIterable[T](i:Iterable[T]){ 
    import Convert.object2SuperObject 
    def printerate(){ 
     i.foreach {x => x.printSelf() } 
    } 
    def printerate(os:OutputStream){ 
     i.foreach { x => x.printSelf(os) } 
    } 
    } 
} 

import conversion.Convert._ 

Второй файл:

package test { 
    object program extends App { 
    new testObj(10) test 
    } 
    class testObj(i: Integer) { 
    def test(){ 
     val range = 0.until(i) 
     0.until(i).printerate() 
    } 
    } 
} 
Смежные вопросы