【发布时间】:2016-07-03 06:11:24
【问题描述】:
说我做一个单参数泛型方法:
trait MyTrait[T] {
def method():T
}
然后扩展它并参数化。这个:
class MyClass extends MyTrait[java.lang.String] {
def method() = "foo"
}
和这个是一样的:
class MyClass extends MyTrait[String] {
def method() = "foo"
}
但是,当您创建一个像这样参数化 lambda 的特征方法时:
trait MyTrait {
def apply[T](input:()=>T):T
}
那你就没那么幸运了。这个:
class MyClass extends MyTrait {
def apply(input:()=>java.lang.String) = "foo"
}
会导致这个:
Error:(25, 45) type mismatch;
found : java.lang.String("foo")
required: String
def apply[String](input:()=>String) = "foo"
^
不过,这很好:
class MyClass extends MyTrait {
def apply[String](input:()=>String) = new String("foo")
}
那么在什么情况下 scalac 真正知道需要进行转换而在什么情况下不知道呢?
此外,即使我写出了 java.lang.String 类型的整个路径
class MyClass extends MyTrait {
def apply[java.lang.String](input:()=>java.lang.String) = new java.lang.String("foo")
}
它抛出另一个错误:
Error:(25, 21) ']' expected but '.' found.
def apply[java.lang.String](input:()=>java.lang.String) = new java.lang.String("foo")
^
如果我想通过直接模板化 java.lang.String 来实现后一种方式,我该怎么做?
【问题讨论】:
-
def apply[String]你在这里声明了一个名为String的类型参数。
标签: java string scala templates generics