我尝试定义这样一个简单的特征:
scala> trait T { def p[A,B]: Map[A,B] }
defined trait T
scala> new T { def p = Map(0 -> 1) }
<console>:7: error: object creation impossible, since method p in trait T of type [A,B]Map[A,B] is not defined
new T { def p = Map(0 -> 1) }
^
怎么回事?
由于
答案 0 :(得分:10)
您可以使用泛型方法,但抽象泛型方法的实现本身必须是通用的:
scala> trait T { def p[A,B]: Map[A,B] }
defined trait T
scala> new T { def p[S, T] = Map[S, T]() }
res13: java.lang.Object with T = $anon$1@1f74864
请记住,无界类型参数是普遍量化的。你说p是为所有类型对定义的,没有异常或约束。许多S和T绑定与Int不兼容,因此您不能只返回需要Map [S,T]的Map [Int,Int]。
更新: Re:“所以我可以使用通用抽象类和特征的非泛型实现,但不能使用泛型方法?”
在这个意义上,您可以使用泛型抽象类的非泛型实现:
abstract class C[A, B, C] { /* ... */ }
class D extends C[Int, String, Boolean] { /* ... */ }
或者像这样:
class E extends C { /* ... */ }
虽然那个与:
相同class E extends C[Nothing, Nothing, Nothing] { /* ... */ }
Nothing
是Scala中无人居住的类型。
但是你不能用非泛型方法实现抽象泛型方法
答案 1 :(得分:4)
我假设你想这样做:
scala> trait T[A,B] { def p: Map[A,B] }
defined trait T
scala> new T[Int,Int] { def p = Map(0 -> 1) }
res0: java.lang.Object with T[Int,Int] = $anon$1@2f1261b1