Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用选项[Boolean] ;来自Java_Java_Scala - Fatal编程技术网

使用选项[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

我有一个Scala特性,它的方法返回Option[Boolean]。我想编写一个Java类来实现这个特性。不幸的是,编译器抱怨以下代码:

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
是一个对象。