我有一个 Java 接口(interface):
public interface FooJava {
void consume(String... strings);
void consume(Integer... ints);
}
我想在 Scala 中实现它:
class BarScala extends FooJava {
override def consume(strings: String*): Unit = ???
override def consume(ints: Integer*): Unit = ???
}
不幸的是,这失败了:
double definition:
override def consume(strings: String*): Unit at line 4 and
override def consume(ints: Integer*): Unit at line 5
have same type after erasure: (strings: Seq)Unit
override def consume(ints: Integer*): Unit = ???
我知道 Java 编译器会创建 Bridge 方法,而 Scala 编译器不会这样做。
我尝试了一种使用 DummyImplicits 的方法:Are DummyImplicits used, and if so, how? ,
但它显然失败了 - consume(ints: Integer*)(implicit i: DummyImplicit)
不覆盖任何内容
class BarScala extends FooJava {
override def consume(strings: String*): Unit = ???
override def consume(ints: Integer*)(implicit i: DummyImplicit): Unit = ???
}
我不拥有 Java 接口(interface)。 可以在 Scala 中实现吗? 我使用的是 Scala 2.12
最佳答案
您可以在 Java 中使用中间抽象类实现接口(interface),并在 Scala 中扩展该抽象类
abstract class FooJavaImpl implements FooJava {
public abstract void consumeInts(Integer... ints);
@Override
public void consume(Integer... ints) {
consumeInts(ints);
}
}
class BarScala extends FooJavaImpl {
override def consume(strings: String*): Unit = ???
def consume(ints: Integer*)(implicit i: DummyImplicit): Unit = ???
override def consumeInts(ints: Integer*): Unit = consume(ints: _*)
}
或者没有DummyImplicit
abstract class FooJavaImpl implements FooJava {
public abstract void consumeInts(Integer... ints);
public abstract void consumeStrs(String... strs);
@Override
public void consume(Integer... ints) {
consumeInts(ints);
}
@Override
public void consume(String... strs) {
consumeStrs(strs);
}
}
class BarScala extends FooJavaImpl {
override def consumeInts(ints: Integer*): Unit = ???
override def consumeStrs(strs: String*): Unit = ???
}
关于实现 Java 接口(interface)的 Scala 类 - 具有相同删除的双重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76014938/