我需要在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
。尽管如此,我还是要感谢您的进一步投入。
全部谢谢!
答案 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
不受限制,因此它可以是任何类型,包括Int
,Double
,Float
或AnyVal
的其他子类型,但不能{{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)