当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Scala中变量声明中的通用通配符》经验,为你挑选了1个好方法。

在Java中我可能会这样做:

class MyClass {
    private List list;

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

......假设(MyImpl implements MyInterface当然).

使用?时,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!
 }

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



1> James Iry..:

直接模拟

import java.util.List;
List list;

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

与Buffer相同

要回答您做出的评论,在Java类型参数中始终是不变的,而不是协变的.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有