gpt4 book ai didi

java - scala 覆盖引用内部类的 java 类方法

转载 作者:搜寻专家 更新时间:2023-10-31 20:34:43 25 4
gpt4 key购买 nike

如果我在 java 中定义了以下类

public class A
{
protected class B
{
}

protected void method(B b) {...}
}

我想在 scala 中继承它并重写方法。我本来希望做以下事情:

class C extends A {

override def method(b: B): Unit = {
// ... do something
super.method(b)
}
}

但是当我这样做时,scala 编译器不喜欢出现以下错误:

方法方法不覆盖任何内容。注意:C 类的父类(super class)包含以下非最终成员命名方法:protected[package ...] def method(x$1: A#B): Unit

我可以让它工作的唯一方法是执行以下操作:

class C extends A {

override def method(b: A#B): Unit = {
// ... do something
super.method(b.asInstanceOf[this.B])
}
}

我发现必须这样做非常难看,想知道是否有更简洁的方法?

谢谢

设计

最佳答案

明显的代码对我有用:

public class A {
public class B {}
protected void method(B b) {
System.out.println("A#method");
}
}

class C extends A {
override def method(b: B): Unit = {
println("C#method")
super.method(b)
}
}

然后在sbt控制台:

scala> new C
res0: C = C@10ecc87a

scala> new res0.B
res1: res0.B = A$B@db9a93b

scala> res0.method(res1)
C#method A$B@db9a93b
A#method A$B@db9a93b

但是,如果我随后修改 C.scala 并让 sbt 进行增量重新编译,我会收到您看到的错误(使用 0.12.4 和 0.13.0 测试)——这可能是值得的提交关于此的 sbt 错误。

关于java - scala 覆盖引用内部类的 java 类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19665145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com