Scala:覆盖返回null的通用Java方法
我需要在Scala类中重写下面的Java方法:
public class Test<T> {
    public T test(T o, boolean x) {
        if (x) {
            return o;
        }
        return null;
    }
}
通过以下方法(在Scala中),编译器会抱怨:“Null类型的表达式不符合预期的类型T”:
class Test2[T] extends Test[T] {
  override def test(o: T, x: Boolean): T = {
    if (x) {
      return o
    }
    return null
  }
}
  我也试着将Option[T]定义为返回值,但是再次,编译器会抱怨方法签名不匹配。 
任何想法? - 谢谢!
编辑:
丹尼尔的建议对原来的问题起作用; 然而,不幸的是,我的实际问题仍然略有不同(通过在方法中使用泛型类型参数,而不是类定义)(对不起):
Java的:
public class Test {
    public <T> T test(T o, boolean x) {
        if (x) {
            return o;
        }
        return null;
    }
}
斯卡拉:
class Test2 extends Test {
  override def test[T >: Null](o: T, x: Boolean): T = {
    if (x) {
      return o
    }
    return null
  }
}
  编译再次失败,出现错误,“类型Null的表达式不符合预期类型T”。 
  (我相信那是因为override不包括任何可能性 - 即, Nothing类型的Nothing可以传递给Test.test(..) - 好吧,可以吗?;-)) 
  工作是抛出一个RuntimeException而不是像Ricky所建议的那样返回null ;  尽管如此,我很感激进一步的投入。 
谢谢大家!
你需要这个:
class Test2[T >: Null] extends Test[T] {
  问题是Nothing不能为null ,并且作为一切的子类型,它是T的有效值。  所以你需要指定Null作为下限。 
编辑
  不幸的是,对于你的实际问题没有好的解决办法。  在这种情况下,您必须编写null.asInstanceOf[T]并将其保留。 
而且,是的,你可以用非空类型来调用它。 试试这个,例如:
object Test3 {
  val test = new Test();
  val x: Int = test.test(5, false);
}
  T是无限制的,因此它可以是任何类型,包括Int , Double , Float或AnyVal其他子类型,它们不能为null 。 
  您可能需要类Test2[T <: AnyRef]而不是类Test[T] ,声明T是任何类型的AnyRef (基本上是java.lang.Object )或其任何子类型。 
  一般来说,尝试返回比null更有用的东西,或抛出异常。  有些情况下你必须这样做是因为某些第三方API,但如果情况并非如此,请查看是否有更好的方法。  null不会出现在方法的类型中,而Option可以。 
你有没有考虑过使用Option来代替下面的工作:
class Test{
  def test[T] (value:T,flag :Boolean) :Option[T] = {
    if (flag){
      Some(value)
    }else{
      None
    }
  }
}
  这将有助于区分诸如test(null,true)和test(null,false) 
上一篇: Scala: Overwriting a Generic Java Method that returns null
