2017-02-06 93 views
0

有人可以解释为什么下面的代码不起作用吗?方法参数中的泛型类型问题

scala> abstract class A[T] {} 
defined class A 

scala> class B {} 
defined class B 

scala> object C extends A[B] {} 
defined object C 

scala> def method(arg: A[Any]): Unit = {} 
method: (arg: A[Any])Unit 

scala> method(C) 
<console>:14: error: type mismatch; 
found : C.type 
required: A[Any] 
Note: B <: Any (and C.type <: A[B]), but class A is invariant in type T. 
You may wish to define T as +T instead. (SLS 4.5) 
     method(C) 

我有一个抽象类,这里命名为A,我希望能够通过任何扩展A [AnythingHere]作为参数传递给方法method。在Java中,我会写public void method(A<?> arg) {},但我不知道如何使它与Scala一起工作,因为没有?

我也尝试将+添加到+T,但经过测试并搜索它的功能后,我在这里找不到它的帮助。就在警告消失

在此先感谢

+0

请参阅http://www.julien.richard-foy.fr/blog/2013/02/21/be-friend-with-covariance-and-contravariance/ – cchantep

回答

3

,如果你想在斯卡拉变种逆变使用泛型的代码不会因为工作,你必须明确地声明。否则,Java 不变的行为被执行。

Java默认为不变量。这意味着如果A<B,那么List[A]List[B]它们之间没有任何层级关系。

斯卡拉使您可以使用声明泛型类型的协变或逆变,这意味着

  1. 如果声明泛型的协变,那么如果要是A<B,然后List[A]<List[B]。要做到这一点,你必须使用语法class A[+T]
  2. 如果声明泛型为逆变申报通用的,那么如果要是A<B,然后List[A]>List[B]。要做到这一点,你必须使用语法class A[-T]
+0

请问您可以添加正确代码的简短示例? – Nicofisi

+0

我在做...等一下:) –

+0

就我所见,'+'不能放在'T'后面,或者告诉我是否我做错了什么;)或者我应该替换那个'+'带什么东西? 'scala> class D [T +] {} :1:error:']'expected,但找到标识符。 class D [T +] {}' – Nicofisi

0

你可能想用声明通用:def method[T](arg: A[T])

这意味着你不需要改变类定义的变化。

相关问题