sun*_*lan 1 java oop interface
为什么我不能用Java做到这一点:
interface Context{
void add(Integer o);
}
class Subclass implements Context{
@Override
public void add(Object o){...}
}
Run Code Online (Sandbox Code Playgroud)
难道Subclass.add不会实现Context.add,因为它添加(Object)可以执行所有add(Integer)可以吗?
这有什么好办法?
现在我正在做一种丑陋的方式:
private void actuallyAdd(Object o){...}
public void add(Object o){actuallyAdd(o);}
public void add(Integer o){actuallyAdd(o);}
Run Code Online (Sandbox Code Playgroud)
编辑:这不是上述问题的重复.在给定的问题中,超类是具有更通用的"对象"作为参数的超类,而子类更具体.这不起作用,因为更具体的方法可能无法处理任何对象.在我的问题中,子类不如超类特定,这意味着子类总是能够处理超类所需的任何内容.
发生这种情况是因为Java编译器要求覆盖方法的签名是重写方法的"子签名".也就是说,参数的类型是相同的,或者参数类型的删除是相同的.
在JLS,第8.4.8.1,这个规定如下:
在C语言中声明或继承的实例方法m C,覆盖了我在接口I中声明的另一个方法,iff以下所有条件都为真:
...
- m C的签名是m I签名的子签名(第8.4.2节).
方法m 1的签名是方法m 2的签名的子签名,如果:
m 2与m 1具有相同的特征,或
m 1的签名与m 2签名的擦除(§4.6)相同.
你可以通过声明一个泛型类型参数来解决这个问题,正如另一个答案所表明的那样,尽管不清楚接口的最初目的是采用一种Integer
特定的或未知的类型.