我有一个Scala Trait,其方法返回Option [Boolean]。我想写一个实现这个特性的Java类。不幸的是,编译器抱怨以下代码:
trait WithBoolean {
def doSth(): Option[Boolean]
}
public class MyClass implements WithBoolean {
@Override
public Option<Boolean> doSth() {
return null;
}
}
编译错误是:
doSth() in MyClass cannot implement doSth() in WithBoolean
public Option<Boolean> doSth() {
^
return type Option<Boolean> is not compatible with Option<Object>
如果我稍微更改代码,它会编译:
public class MyClass implements WithBoolean {
@Override
public Option<Object> doSth() { //return type has been changed to Object
return null;
}
}
但这显然不是一个好的解决方案。为了能够使用正确的返回类型,我需要更改什么?
答案 0 :(得分:2)
我现在无法对此进行测试,但最好的猜测是,您有一些import
混淆,因此尝试使用Option<scala.Boolean>
覆盖Option<java.lang.Boolean>
。< / p>
答案 1 :(得分:1)
你能试试吗
public class MyClass implements WithBoolean {
@Override
public Option<? super Boolean> doSth() {
return null;
}
}
答案 2 :(得分:0)
您可以尝试以下方法:
(value != null)?new Some<T>(value):scala.Option.apply((T) null);
(value != null)?new Some<Boolean>(value):scala.Option.apply((Boolean) null);
答案 3 :(得分:0)
从类描述中:
Boolean
(相当于Java的boolean
基本类型)是[[scala.AnyVal]]的子类型。基础运行时系统中的对象Boolean
未被对象表示。
Java布尔值扩展了AnyRef
(有关here的更多信息)。
AnyRef
和AnyVal
都扩展了Any
,相当于java.lang.Object
。
这就是为什么只有Option<Object>
起作用的原因。
如果您想输入安全性,可以这样做:
trait WithBoolean {
def doSth(): Option[Boolean]
}
abstract class WithBooleanForJava extends WithBoolean {
override def doSth(): Option[Boolean] = doSthJava().map(Boolean.box(_))
def doSthJava(): Option[java.lang.Boolean]
}
所以您的java类看起来像您想要的:
public class MyClass extends WithBooleanForJava {
@Override
public Option<Boolean> doSthJava() {
return null;
}
}