在Java中,我可以这样做:
class MyClass {
private List<? extends MyInterface> list;
public void setList(List<MyImpl> l) { list = l; }
}
… MyImpl implements MyInterface
当然假设()。
使用 Scala 时, Scala 的模拟与此类似Buffer
吗?
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] = _;
与缓冲区相同
为了回答您提出的评论,在Java类型参数中,参数始终是不变的,而不是协变的。
问题内容: 您如何声明和初始化要在Play2 Scala模板中本地使用的变量? 我有这个: 在模板的顶部声明,但它给了我这个错误: 问题答案: 基本上,您必须包装要使用它的块
问题内容: 假设我有一个通用类: 这些声明之间有什么区别? 问题答案: 没有泛型参数就不能存在泛型类型,因此省略泛型类型意味着您希望编译器推断该类型。 在这种情况下,要推断的逻辑类型为。 请注意,这仅适用于您使用了内部声明。它不适用于其他泛型类。 可以在变量声明中使用类似的通用参数推断:
并在查询中更改此变量的值?
问题内容: 如何在简短的变量声明中从其他块中重新声明变量? 关于此问题有很长的话题,但现在我很感兴趣如何解决此问题。 问题答案: 简短的变量声明的Go规范很明确: 短变量声明可以重新声明变量,只要它们最初是在同一块中以相同类型声明的,并且至少一个非空变量是新变量。 因此,在简短的变量声明中,您无法重新声明最初在其他块中声明的变量。 这是一个如何通过在内部块中声明局部变量()并将其()分配给在外部块
let和const是JavaScript里相对较新的变量声明方式。 像我们之前提到过的,let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题。 const是对let的一个增强,它能阻止对一个变量再次赋值。 因为TypeScript是JavaScript的超集,所以它本身就支持let和const。 下面我们会详细说明这些新的声明方式以及为什么推荐使用它们来代替v
问题内容: 最近有人问我这在python中是什么意思: 我不知道。我以前从未见过。我检查了文档,没有类似的东西。一个人的建议是它是静态类型声明,但是在文档中也绝对没有任何内容。 有了以上,如果我 失败了 如果我可以,并且type(char)的结果是。但是它不能是静态声明,因为我可以并且type(char)变为。 所以我来这里是为了收集许多SO霸主的智慧。这意味着什么? 问题答案: 您正在查看变量的