使用选项[Boolean] ;来自Java
我有一个Scala特性,它的方法返回Option[Boolean]。我想编写一个Java类来实现这个特性。不幸的是,编译器抱怨以下代码:使用选项[Boolean] ;来自Java,java,scala,Java,Scala,我有一个Scala特性,它的方法返回Option[Boolean]。我想编写一个Java类来实现这个特性。不幸的是,编译器抱怨以下代码: trait WithBoolean { def doSth(): Option[Boolean] } public class MyClass implements WithBoolean { @Override public Option<Boolean> doSth() { return null; } } trai
trait WithBoolean {
def doSth(): Option[Boolean]
}
public class MyClass implements WithBoolean {
@Override
public Option<Boolean> doSth() {
return null;
}
}
trait with boolean{
def doSth():选项[布尔值]
}
公共类MyClass使用Boolean实现{
@凌驾
公共选项doSth(){
返回null;
}
}
编译错误是:
doSth() in MyClass cannot implement doSth() in WithBoolean
public Option<Boolean> doSth() {
^
return type Option<Boolean> is not compatible with Option<Object>
MyClass中的doSth()无法在WithBoolean中实现doSth()
公共选项doSth(){
^
返回类型选项与选项不兼容
如果我稍微更改代码,它会编译:
public class MyClass implements WithBoolean {
@Override
public Option<Object> doSth() { //return type has been changed to Object
return null;
}
}
公共类MyClass使用Boolean实现{
@凌驾
公共选项doSth(){//返回类型已更改为Object
返回null;
}
}
但这显然不是一个好的解决方案。为了能够使用正确的返回类型,我需要做哪些更改?您能试试吗
public class MyClass implements WithBoolean {
@Override
public Option<? super Boolean> doSth() {
return null;
}
}
公共类MyClass使用Boolean实现{
@凌驾
public Option我现在无法测试,但我最好的猜测是您有一些导入
s混淆,因此尝试使用选项覆盖选项
,您可以尝试以下操作:
(value != null)?new Some<T>(value):scala.Option.apply((T) null);
(value != null)?new Some<Boolean>(value):scala.Option.apply((Boolean) null);
(value!=null)?新的一些(value):scala.Option.apply((T)null);
(value!=null)?新的一些(值):scala.Option.apply((布尔)null);
来自课程描述:
Boolean
(相当于Java的Boolean
基元类型)是[[scala.AnyVal]]的子类型。Boolean
的实例不由底层运行时系统中的对象表示
Java Boolean扩展了AnyRef(更多信息)。
AnyRef
和AnyVal
都扩展了Any
,这相当于java.lang.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;
}
}
公共类MyClass使用BooleanForJava扩展{
@凌驾
公共选项doSthJava(){
返回null;
}
}
@user3346601听到这个消息很遗憾:(除了import scala.Option;
之外,没有任何导入;
在这种情况下,Java代码中的非限定Boolean
将引用Java.lang.Boolean
,这与scala接口中的scala.Boolean
完全无关。而scala.Boolean不能从Java中使用,因此Java所看到的类型不幸是Option。)。@阿列克谢·罗曼诺夫:啊,对了,scala.Boolean实际上并不存在,因为它是一种幻觉,让人以为原始bool
是一个对象。