重写方法时,C++和Java支持返回类型协方差.
但是,它们都不支持参数类型的反差 - 相反,它转换为过载(Java)或隐藏(C++).
那是为什么?在我看来,允许这样做是没有害处的.我可以在Java中找到它的一个原因 - 因为它无论如何都有"选择最特定版本"的重载机制 - 但是不能想到C++的任何原因.
示例(Java):
class A {
public void f(String s) {...}
}
class B extends A {
public void f(Object o) {...} // Why doesn't this override A.f?
}
Run Code Online (Sandbox Code Playgroud) 我最近开始使用JAVA编程并且有一个问题要问.假设我有一个SuperClass和一个SubClass,它扩展了SuperClass并尝试覆盖SuperClass中定义的方法,如下所示:
public class SuperClass{
public void method1(int val){
System.out.println("This is method in SuperClass.Val is:" + val);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试在我的SubClass中扩展SuperClass并使用一个例外覆盖该方法,而不是int在method1中声明的类型,我使用参数的类型Integer,如下所示:
public class SubClass extends SuperClass{
@Override
public void method1(Integer val){ ///compiler gives an error
}
}
Run Code Online (Sandbox Code Playgroud)
编译器不允许使用SubClass方法的声明(我正在使用eclipse IDE).为什么会这样?整数本质上是int的包装,那为什么禁止这样的声明呢?
谢谢
为什么我不能用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)
编辑:这不是上述问题的重复.在给定的问题中,超类是具有更通用的"对象"作为参数的超类,而子类更具体.这不起作用,因为更具体的方法可能无法处理任何对象.在我的问题中,子类不如超类特定,这意味着子类总是能够处理超类所需的任何内容.
这是我基本上想要的代码,它不会编译:
interface Interface {
interface ArgumentInterface {
// Some methods
}
void doCallback(Consumer<? super ArgumentInterface> callback);
}
interface SubInterface extends Interface {
interface ArgumentSubInterface extends ArgumentInterface {
// Some more methods
}
@Override
void doCallback(Consumer<? super ArgumentSubInterface> callback);
}
Run Code Online (Sandbox Code Playgroud)
这里的想法是Interface将ArgumentInterface的实例传递给用户提供的Consumer,而SubInterface将传递更具体的ArgumentSubInterface的实例.特别是,我希望用户能够将Consumer <ArgumentSubInterface>传递给SubInterface.doCallback()并使其工作.
天真地看起来这应该像写作一样:接口版本接受的任何参数也将被SubInterface的版本接受.但是,Java声称该方法不会覆盖.
java ×4
oop ×2
c++ ×1
generics ×1
inheritance ×1
interface ×1
overriding ×1
polymorphism ×1
variance ×1