Я пытаюсь написать фабричный метод, который возвращает Foo [T: ClassManifest] (который мне нужен из-за требований библиотеки, к которой я передаю результат), не зная конкретно, что такое T. Мой код эквивалентен:Как создать фабричный метод в scala, который возвращает класс, общий параметр которого ограничен ClassManifest?
class Foo[T: ClassManifest] (t: T) {
def getValue: T = t
override def toString: String = "Foo["+t+": "+t.getClass().getName()+"]"
}
object FooFactory {
def parse (value: String): Foo[_] = {
val rest = value.substring(1)
value.head match {
case 's' => new Foo[String](rest)
case 'i' => new Foo[Int](rest.trim.toInt)
case 'd' => new Foo[Double](rest.trim.toDouble)
}
}
}
class FactoryTestSuite extends FunSuite {
def printIt [T: ClassManifest] (t: Foo[T]): Unit =
println(t)
test("Creation") {
printIt(FooFactory.parse("sabc"))
printIt(FooFactory.parse("i123"))
printIt(FooFactory.parse("d1.23"))
}
}
Это не будет компилироваться - каждый из создания тестовых линий жалуются, что could not find implicit value for evidence parameter of type ClassManifest[_$1]
Есть ли способ сделать это? Или требования времени компиляции для ClassManifest делают это просто невозможным?
@NathanKronenfeld: Я думаю, естественный способ, чтобы добавить его в поле 'Foo'. См. Обновление. – senia
, когда я добавляю 'val manifest = неявно [ClassManifest [T]]' to 'Foo', это, похоже, не имеет никакого значения - я получаю точно такую же ошибку. Если вместо этого я попробую ваш второй подход и передам манифест класса отдельно, я не вижу, как будет выглядеть манифест класса и реальные возвращаемые значения - компилятор не будет знать, что это манифест класса правильного типа, не так ли? –
Вам не нужно 'T: ClassManifest' в' printIt'. См. Обновление. – senia