Scala 方法参数中泛型类型的问题
有人能解释一下为什么下面的代码不起作用吗Scala 方法参数中泛型类型的问题,scala,generics,Scala,Generics,有人能解释一下为什么下面的代码不起作用吗 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
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)
scala>抽象类A[T]{
定义的A类
scala>B类{}
定义的B类
scala>对象C扩展了[B]{}
定义对象C
scala>def方法(arg:A[Any]):Unit={}
方法:(arg:A[Any])单位
scala>方法(C)
:14:错误:类型不匹配;
发现:C型
必需:A[任何]
注意:B代码不起作用,因为如果您想在Scala中使用variant或contravariant中的泛型,必须显式声明它。否则,将实现Java不变行为
Java在默认情况下是不变的。这意味着如果A
代码不起作用,因为如果要在Scala中使用variant或contravariant中的泛型,必须显式声明它。否则,将实现Java不变行为
Java在默认情况下是不变的。这意味着如果A
您可能希望使用:def method[T](arg:A[T])
这意味着您不需要更改类定义的差异。您可能希望使用:def method[t](arg:A[t])
这意味着您不需要更改类定义的差异。您可以添加一个正确代码的简短示例吗?我正在做……等一下:)据我所知,+
不能放在t
之后,或者告诉我我是否做错了什么;)或者我应该用什么东西来代替+
<代码>scala>类D[T+]{}:1:错误:']',但找到标识符。D类[T+]{}
好的,非常感谢您的解释;我想我理解它,但我仍然不确定如何在我的特殊情况下使用它。我应该如何声明A
以及能够将扩展抽象类A
(或者可以是traitA
)的任何内容作为参数传递的方法?这里有什么好词吗?请看我的代码,试着告诉我:)我将非常感激!你试过简单地将方法的参数分离为[uu]和A的泛型作为协变吗?你能添加一个正确代码的简短示例吗?我正在做……等等:)据我所知,+
不能放在t
之后,或者告诉我我是否做错了什么;)或者我应该用什么东西来代替+
<代码>scala>类D[T+]{}:1:错误:']',但找到标识符。D类[T+]{}
好的,非常感谢您的解释;我想我理解它,但我仍然不确定如何在我的特殊情况下使用它。我应该如何声明A
以及能够将扩展抽象类A
(或者可以是traitA
)的任何内容作为参数传递的方法?这里有什么好词吗?请看我的代码,试着告诉我:)我将非常感激!您是否尝试过简单地将方法的参数分离为[u]并将泛型类型分离为协变?请参阅