为引用类型传递null时出现Scala 2.7.x类型不匹配错误
以下Scala代码未能在Scala 2.7.7中编译,最后一行出现类型不匹配错误“found:Null(Null)required:T”:为引用类型传递null时出现Scala 2.7.x类型不匹配错误,scala,compiler-errors,Scala,Compiler Errors,以下Scala代码未能在Scala 2.7.7中编译,最后一行出现类型不匹配错误“found:Null(Null)required:T”: /** * @param [T] key type */ class Key[T] class Entry[T](val k: Key[T], val v: T) def makeEntry[T <: AnyRef] = new Entry[T](new Key[T], null) /** *@param[T]键类型 */ 类键[T] 类条
/**
* @param [T] key type
*/
class Key[T]
class Entry[T](val k: Key[T], val v: T)
def makeEntry[T <: AnyRef] = new Entry[T](new Key[T], null)
/**
*@param[T]键类型
*/
类键[T]
类条目[T](值k:键[T],值v:T)
def makeEntry[T您尝试过这个吗
def makeEntry[T <: AnyRef] = new Entry[T](new Key[T], null: T)
def makeEntry[T以下是涵盖null
的定义:
类型Null是所有引用类型的子类型;其唯一实例是Null引用。由于Null不是值类型的子类型,Null不是任何此类类型的成员。例如,无法将Null分配给Int类型的变量
在英语中,这表示不能将null
赋值给值类型,但可以将其赋值给任何引用类型
我在确定T
是值类型还是引用类型时遇到了一些困难;但这可以回答您的问题
当您将T
定义为AnyRef
的一个子类型时,我想这是一个ref,而“bug”的解释似乎更可能出现;特别是Mitch Blevins刚刚说代码在2.8下工作。试试这个:
class Key[T <: AnyRef]
class Entry[T <: AnyRef](val k: Key[T], val v: T)
def makeEntry[T <: AnyRef] = new Entry[T](new Key[T], null.asInstanceOf[T])
class Key[T显然,在2.7中实现这一点的方法是:
class Key[T]
class Entry[T](val k: Key[T], val v: T)
def makeEntry[T >: Null] = new Entry(new Key[T], null)
使用REPL和scala 2.7.5时也会出现同样的问题。我没有意识到这是有效的语法。:)只是尝试了一下,它也不起作用。我手头没有2.7可供测试,但我也会尝试null。asInstanceOf[t]在scala中不起作用(实际上我无论如何也不能使用该技术,因为键和条目实际上是在另一个库中定义的Java类)这似乎是共识,这应该是工作,所以我会接受你的答案,除非相反的证据出现。