gpt4 book ai didi

java - Scala 变量声明中的通用通配符

转载 作者:太空狗 更新时间:2023-10-29 22:42:55 25 4
gpt4 key购买 nike

在 Java 中我可能会这样做:

class MyClass {
private List<? extends MyInterface> list;

public void setList(List<MyImpl> l) { list = l; }
}

...当然假设(MyImpl 实现 MyInterface)。

当使用 Buffer 时,Scala 中的模拟是什么?

import java.lang.reflect._
import scala.collection.mutable._

class ScalaClass {
val list:Buffer[MyInterface] = null

def setList(l: Buffer[MyImpl]) = {
list = l
}
}

这(当然)不会编译 - 但我如何以它可以编译的方式声明 list 变量?

编辑;我再补充一点。区别显然与以下事实有关:在 Java 中,泛型在 T 中从不协变,而在 Scala 中,它们可以是协变的,也可以不是。例如,Scala 类 List 在 T 中是协变的(并且必然是不可变的)。因此,以下将编译:

class ScalaClass {
val list:List[MyInterface] = null

def setList(l: List[MyImpl]) = {
list = l
}
}

我仍在为编译器错误而苦苦挣扎:

Covariant type T occurs in contravariant position in ...

例如;此编译器错误发生在类声明中:

class Wibble[+T] {
var some: T = _ //COMPILER ERROR HERE!
}

我要问一个单独的问题...

最佳答案

直接模拟

import java.util.List;
List<? extends MyInterface> list;

import java.util.List
var list : List[_ <: MyInterface] = _;

同样处理 Buffer

为了回答您之前的评论,在 Java 中类型参数始终是不变的,而不是协变的。

关于java - Scala 变量声明中的通用通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/663032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com