【问题标题】:Unable to implement methods from a class that implements an interface?无法从实现接口的类中实现方法?
【发布时间】:2014-04-12 07:14:50
【问题描述】:

我开始认为我不像我想象的那样理解多态性。

我有以下情况:

public class Testing {
    public static void main(String[] args){
        interTest myTest = new classTest();
        myTest.classMethod();

    }
}

使用给定的接口:

public interface interTest {

    public boolean checkBoolean();
    public void method();

}

然后是具体的类:

public class classTest implements interTest{

    public classTest() {
        // TODO Auto-generated constructor stub
    }

    public void classMethod(){
        System.out.println("fail");
    }

    // Both method() and checkBoolean() are overridden here & do nothing.

    }

}

Oracle 文档演示了实现一个接口,然后添加其他方法,甚至实现多个接口(因此包括不在其中一个接口中的方法),我认为这是司空见惯的,直到我遇到问题试图自己做。

在这种情况下,我无法访问classMethod,因为它不在界面内。

The method classMethod() is undefined for the type interTest

我对多态性有什么不了解?我想以如下形式声明一个变量:

Interface object = new ConcreteClass();

创建了一个可以访问 ConcreteClass() 方法的接口对象。这就是您制作多个对象的方法,这些对象都具有相同的类型(接口),并且可以放入特定类型的列表中,但它们是不同的。

为什么我不能调用myTest.classMethod() 方法?

【问题讨论】:

    标签: java methods interface scope polymorphism


    【解决方案1】:

    在编译时,方法是根据调用它们的表达式的类型来解析的。

    Interface object = new ConcreteClass();
    object.classMethod();
    

    方法 classMethod() 是在 Interface 类型的变量上调用的,该变量没有声明或具有名为 classMethod() 的可见方法。

    ConcreteClass 类型确实声明​​了这样一个方法,所以你可以这样做

    ConcreteClass object = new ConcreteClass();
    object.classMethod();
    

    甚至

    ((ConcreteClass) object).classMethod();
    

    如果您确定 object 正在引用 ConcreteClass 对象。否则你会在运行时得到一个ClassCastException


    基本上,您需要了解编译时类型和静态类型与运行时类型和动态类型之间的区别。

    Interface object = new ConcreteClass();
    

    object 的静态类型是Interface。在运行时,变量引用了ConcreteClass 类型的对象,所以它的运行时类型是ConcreteClass

    【讨论】:

    • 那么你什么时候/为什么要做List myList = new ArrayList()之类的事情?有没有更好的方法来实现这一点? IE 通过抽象类和扩展?
    • @leigero 回答这个问题:What does it mean to "program to an interface"? 如果你想调用一个方法,你需要在解析为声明这种方法的类型的表达式上调用它。如何做到这一点取决于您的用例。
    • 好的,谢谢。很高兴知道这并不像我想象的那么明显(至少对我来说不是)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 2020-04-02
    • 2021-11-30
    相关资源
    最近更新 更多