加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 08:50:33 所属栏目:安全 来源:网络整理
导读:我需要在 Scala类中覆盖以下 Java方法: public class TestT { public T test(T o,boolean x) { if (x) { return o; } return null; }} 使用以下方法(在Scala中),编译器抱怨说,“Null类型的表达式不符合预期的类型T”: class Test2[T] extends Test[T] { ov
我需要在 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”.
(我相信这是因为覆盖不包括任何可能性 – 即,什么类型的东西都没有传递给Test.test(..) – 好吧,可能吗?;-))

正如Ricky建议的那样,工作是抛出RuntimeException而不是返回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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读