【问题标题】:Scala 2.7.x type mismatch error when passing null for a reference type为引用类型传递 null 时出现 Scala 2.7.x 类型不匹配错误
【发布时间】:2009-12-10 21:23:46
【问题描述】:

以下 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)

我完全意识到空值的邪恶,但只要说我确实需要这样做就足够了。这是编译器错误还是程序员错误?

编辑: 澄清一下,T 是一个类型参数,而不是具体类型。直到我更仔细地阅读了卡尔的回答,我才意识到这在原始问题中是模棱两可的。

【问题讨论】:

    标签: scala compiler-errors


    【解决方案1】:

    显然,在 2.7 中执行此操作的 correct way 是:

    class Key[T]
    
    class Entry[T](val k: Key[T], val v: T)
    
    def makeEntry[T >: Null] = new Entry(new Key[T], null)
    

    【讨论】:

      【解决方案2】:

      这是涵盖null的定义:

      Type Null 是所有引用类型的子类型;它的唯一实例是空引用。由于 Null 不是值类型的子类型,因此 null 不是任何此类类型的成员。例如,不能将 null 分配给 Int 类型的变量。

      在英语中,这表示您不能将 null 分配给值类型,但分配给任何引用类型都是有效的。

      我无法确定T 是值类型还是引用类型;但这会回答你的问题。

      当您将T 定义为AnyRef 的子类型时,我猜它是一个引用并且“错误”解释似乎更有可能;尤其是 Mitch Blevins 刚刚说代码在 2.8 下工作。

      【讨论】:

      • 这似乎是一个共识,所以我会接受你的回答,除非有相反的证据出现。
      【解决方案3】:

      试试这个:

      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])
      

      我不确定为什么需要“asInstanceOf[T]”,但似乎是这样。

      【讨论】:

      • 在 Scala 中不起作用(实际上我也无法使用该技术,因为 Key 和 Entry 是在另一个库中定义的真正 Java 类)
      【解决方案4】:

      你试过了吗?

      def makeEntry[T <: AnyRef] = new Entry[T](new Key[T], null: T)
      

      【讨论】:

      • 使用 REPL 和 scala 2.7.5 的同样问题。
      • 我没有意识到这是有效的语法。 :) 刚试了一下,还是不行。
      • 我没有 2.7 方便测试,但我也会尝试 null.asInstanceOf[T]
      猜你喜欢
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 2015-01-17
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多