无法实例化特征

时间:2010-07-20 17:12:33

标签: scala

我尝试定义这样一个简单的特征:

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) }
       ^

怎么回事?

由于

2 个答案:

答案 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