作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码:
interface InterfaceA {}
interface InterfaceB extends InterfaceA {
}
interface InterfaceC {
public void doSomething(InterfaceA t);
}
class ConcreteA implements InterfaceC {
public void doSomething(InterfaceB t) {
// Do something
}
}
但我收到以下错误:
ConcreteA不是抽象的,不会重写InterfaceC中的抽象方法insert(InterfaceA)
现在,我的理解是因为 InterfaceB 是从 InterfaceA 扩展而来的,所以我应该能够在需要 InterfaceA 的函数中使用 InterfaceB,但事实并非如此。谁能向我解释为什么这不起作用并指出解决问题的正确方向?
提前致谢!
最佳答案
但是ConcreteA的方法签名与接口(interface)声明不同。Java 编译器期望 InterfaceA 准确地传递给 doSomething
方法。
您需要将其更改为有效的:
class ConcreteA implements InterfaceC {
public void doSomething(InterfaceA t) {
// Do something
}
}
上述声明不会阻止您传递实现 InterfaceB 的对象作为参数,但方法声明必须与 InterfaceC
定义匹配。
或者支持通用类型:
interface InterfaceC <T extends InterfaceA> {
void doSomething(T t);
}
class ConcreteA implements InterfaceC<InterfaceB> {
public void doSomething(InterfaceB t) {
// Do something
}
}
关于java - ConcreteA 不是抽象的,不会重写 Interface 中的抽象方法 doSomething(InterfaceS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61119364/
我有以下代码: interface InterfaceA {} interface InterfaceB extends InterfaceA { } interface InterfaceC {
我是一名优秀的程序员,十分优秀!