使用 Java 中的 Option[Boolean]

4

我有一个带有返回值为Option[Boolean]的Scala Trait。我想编写一个实现该Trait的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个回答

2

我现在无法进行测试,但我的最佳猜测是你的一些import混淆了,因此尝试用Option<java.lang.Boolean>覆盖Option<scala.Boolean>


除了 import scala.Option; 之外,没有其他的导入。 - user3346601
在这种情况下,Java代码中未经限定的“Boolean”将指向“java.lang.Boolean”,这与Scala接口中的“scala.Boolean”完全无关。 - Jörg W Mittag
而 scala.Boolean 无法从 Java 中使用,因此 Java 看到的类型是不幸的 Option<Object>。 - Alexey Romanov
@AlexeyRomanov:啊,没错,scala.Boolean实际上并不存在,因为它是编译器发明的虚构类,旨在营造原始类型bool是对象的假象。 - Jörg W Mittag

1

你能试试吗?

public class MyClass implements WithBoolean {
  @Override
  public Option<? super Boolean> doSth() {
    return null;
  }
}

@user3346601 很抱歉听到这个消息 :( - Zoltán

0
你可以尝试这个:
(value != null)?new Some<T>(value):scala.Option.apply((T) null);

(value != null)?new Some<Boolean>(value):scala.Option.apply((Boolean) null);

0

从类描述:

Boolean(相当于Java的boolean原始类型)是[[scala.AnyVal]]的子类型。 Boolean的实例在底层运行时系统中不由对象表示。

Java Boolean扩展了AnyRef(有关此内容的更多信息请点击此处)。
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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接