Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接口类型变量(通过超类实现)中子类的对象调用超类方法?_Java_Inheritance - Fatal编程技术网

Java 接口类型变量(通过超类实现)中子类的对象调用超类方法?

Java 接口类型变量(通过超类实现)中子类的对象调用超类方法?,java,inheritance,Java,Inheritance,我有一个接口、一个实现它的超类和一个扩展超类的子类。然后我有一个测试,它创建了一个子类类型的对象,但将它存储在接口类型的变量中。当我使用在接口中定义、在超类中实现并在子类中重写的方法时,它会从超类调用该方法。为什么会这样?我无法更改测试类,但我是否对该子类做了一些错误 public interface SampleInterface<T extends Comparable<T>>{ void add(T element); //other methods, et

我有一个接口、一个实现它的超类和一个扩展超类的子类。然后我有一个测试,它创建了一个子类类型的对象,但将它存储在接口类型的变量中。当我使用在接口中定义、在超类中实现并在子类中重写的方法时,它会从超类调用该方法。为什么会这样?我无法更改测试类,但我是否对该子类做了一些错误

public interface SampleInterface<T extends Comparable<T>>{
    void add(T element);
//other methods, etc
}


public class SampleClassA<T extends Comparable<T>> implements SampleInterface<T> {
    public void add(){
        System.out.println("super");
    }
}

@Override
public class SampleClassB<T extends Comparable<T>> extends SampleClassA<T> {
    public void add(){
        System.out.println("sub");
    }
}
公共接口采样接口{
无效添加(T元素);
//其他方法等
}
公共类SampleClassA实现SampleInterface{
公共无效添加(){
System.out.println(“超级”);
}
}
@凌驾
公共类SampleClassB扩展了SampleClassA{
公共无效添加(){
系统输出打印号(“sub”);
}
}
然后我想在测试中使用代码,如下所示:

private SampleInterface<Integer> test = new SampleClassB<Integer>();
test.add();
private SampleInterface test=new SampleClassB();
test.add();

它打印的是“超级”,但我要的是“sub”。这也是我的代码的简化版本。

显示实际代码和结果可能有助于我们更好地理解您的问题。很可能您没有使用“@Override”,这意味着您没有重写而是隐藏了该方法。但是如果没有代码,这只是一个猜测。即使没有@Override,如果方法具有正确的签名,它也会工作,并且子类的方法会被调用。。。。但是需要有“是”代码才能查看您发布的代码中的问题所在界面的
add
方法与类的
add
方法具有不同的签名。@MikeKeegan由于Eran说的原因,这个问题中给出的代码无法编译。您将得到一个类似“SampleClassA不是抽象的,但未实现add(T)”的错误。另外:重写应该继续,方法应该被重写,而不是类(如果它也被编译的话,我会感到惊讶)。