Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 方法参数中泛型类型的问题_Scala_Generics - Fatal编程技术网

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
(或者可以是trait
A
)的任何内容作为参数传递的方法?这里有什么好词吗?请看我的代码,试着告诉我:)我将非常感激!你试过简单地将方法的参数分离为[uu]和A的泛型作为协变吗?你能添加一个正确代码的简短示例吗?我正在做……等等:)据我所知,
+
不能放在
t
之后,或者告诉我我是否做错了什么;)或者我应该用什么东西来代替
+
<代码>scala>类D[T+]{}:1:错误:']',但找到标识符。D类[T+]{}
好的,非常感谢您的解释;我想我理解它,但我仍然不确定如何在我的特殊情况下使用它。我应该如何声明
A
以及能够将扩展抽象类
A
(或者可以是trait
A
)的任何内容作为参数传递的方法?这里有什么好词吗?请看我的代码,试着告诉我:)我将非常感激!您是否尝试过简单地将方法的参数分离为[u]并将泛型类型分离为协变?请参阅