[英]Scala: Overwriting a Generic Java Method that returns null
我需要在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
都没有传递给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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.