Scala:覆盖返回null的泛型Java方法

时间:2011-06-21 16:35:50

标签: scala

我需要在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]定义为返回值,但是再一次,编译器抱怨方法签名不匹配。

有什么想法吗? - 谢谢!


修改:

丹尼尔的建议适用于最初发布的问题;但是,我的实际问题仍然略有不同(通过在方法中使用泛型类型参数,而不是,定义)(抱歉):

爪哇:

public class Test {
    public <T> T test(T o, boolean x) {
        if (x) {
            return o;
        }
        return null;
    }
}

Scala的:

class Test2 extends Test {
  override def test[T >: Null](o: T, x: Boolean): T = {
    if (x) {
      return o
    }
    return null
  }
}

再次编译失败并出现错误,“Null类型的表达式不符合预期的类型T” (我相信这是因为override没有涵盖任何可能性 - 即类型Nothing可以传递给Test.test(..) - 好吧,是吗?;-))

正如Ricky建议的那样,工作是投掷RuntimeException而不是返回null。尽管如此,我还是要感谢您的进一步投入。

全部谢谢!

3 个答案:

答案 0 :(得分:12)

你需要这个:

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);
}

答案 1 :(得分:6)

T不受限制,因此它可以是任何类型,包括IntDoubleFloatAnyVal的其他子类型,但不能{{1} }}

您可能需要课程null而不是课程Test2[T <: AnyRef],声明Test[T]T(基本上是AnyRef)或其任何子类型的任何类型

通常,尝试返回比null更有用的东西,或者抛出异常。可能存在由于某些第三方API而必须执行此操作的情况,但如果不是这种情况,请查看是否有更好的方法。 java.lang.Object没有出现在方法的类型中,而null则出现在。{/ p>

答案 2 :(得分:0)

您是否考虑过使用Option而不是以下工作:

class Test{
  def test[T] (value:T,flag :Boolean) :Option[T] = {
    if (flag){
      Some(value)
    }else{
      None
    }
  }
}

这有助于区分test(null,true)test(null,false)

等情况