我需要在Scala类中覆盖以下Java方法:
public class Test<T> {
public T test(T o, boolean x) {
if (x) {
return o;
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
使用以下方法(在Scala中),编译器抱怨说,"Null类型的表达式不符合预期的类型T":
class Test2[T] extends Test[T] {
override def test(o: T, x: Boolean): T = {
if (x) {
return o
}
return null
}
}
Run Code Online (Sandbox Code Playgroud)
我也试图定义Option[T]为返回值,但是再一次,编译器抱怨方法签名不匹配.
任何的想法?- 谢谢!
编辑:
丹尼尔的建议适用于最初发布的问题; 但是,遗憾的是我的实际问题仍然略有不同(通过在方法中使用泛型类型参数,而不是类,定义)(抱歉):
Java的:
public class Test {
public <T> T test(T o, boolean x) {
if (x) {
return o;
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
斯卡拉:
class Test2 extends Test {
override def test[T >: Null](o: T, x: Boolean): T = {
if (x) {
return o
}
return null
}
}
Run Code Online (Sandbox Code Playgroud)
再次编译失败,错误"类型Null的表达式不符合预期类型T".
(我相信那是因为override它没有涵盖任何可能性 - 也就是说,某种类型的东西Nothing可以传递给Test.test(..)- 好吧,是吗?;-))
正如瑞奇建议的那样,工作是投掷RuntimeException而不是回归null; 尽管如此,我还要感谢您的进一步投入.
谢谢大家!
Dan*_*ral 13
你需要这个:
class Test2[T >: Null] extends Test[T] {
Run Code Online (Sandbox Code Playgroud)
问题是Nothing不可能null,并且,作为一切的子类型,它是一个有效的值T.所以你需要指定Null为下限.
编辑
不幸的是,你的实际问题并没有好办法.在这种情况下,你必须写下null.asInstanceOf[T]并保留它.
并且,是的,您可以使用非可空类型调用它.试试这个,例如:
object Test3 {
val test = new Test();
val x: Int = test.test(5, false);
}
Run Code Online (Sandbox Code Playgroud)
T是不受限制的,因此它可以是任何类型,包括Int,Double,Float或其它亚型的AnyVal从而无法null.
你可能想要类Test2[T <: AnyRef]而不是类Test[T],声明T这是AnyRef(基本上java.lang.Object)任何类型或其任何子类型.
通常,尝试返回比null更有用的东西,或者抛出异常.可能存在由于某些第三方API而必须执行此操作的情况,但如果不是这种情况,请查看是否有更好的方法.null例如,没有出现在方法的类型中Option.
| 归档时间: |
|
| 查看次数: |
4597 次 |
| 最近记录: |