使用Java中的Option [Boolean]

时间:2014-09-01 15:24:27

标签: java scala

我有一个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;
  }
}

但这显然不是一个好的解决方案。为了能够使用正确的返回类型,我需要更改什么?

4 个答案:

答案 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的更多信息)。
AnyRefAnyVal都扩展了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;
    }
}