Java:在实现接口的子类中,如何实现和引用仅子类的方法和类?

Java:在实现接口的子类中,如何实现和引用仅子类的方法和类?,java,Java,我很难理解Java中有关继承和多态性的一些基本概念 我试图为实现给定父接口的子类调用仅限子类的方法。但是,当我实例化子类对象并将其放入父类接口时,我不能调用这些仅子类的方法。我如何在不影响多态性的情况下做到这一点 Contract.java myContract.java app.java: 使用instanceof运算符检查对象是否为指定类型的实例。如果是,则可以强制转换该对象并调用该方法 Contract myContract = new myContract(); if(

我很难理解Java中有关继承和多态性的一些基本概念

我试图为实现给定父接口的子类调用仅限子类的方法。但是,当我实例化子类对象并将其放入父类接口时,我不能调用这些仅子类的方法。我如何在不影响多态性的情况下做到这一点

Contract.java

myContract.java

app.java:

使用instanceof运算符检查对象是否为指定类型的实例。如果是,则可以强制转换该对象并调用该方法

    Contract myContract = new myContract();

    if(myContract instanceof MyContract){
        ((MyContract)myContract).anotherMethod();
    }

您与您的命名有冲突。您正在创建一个名为myContract的类,以及一个对象myContract。由于对象的作用域在作用域中,因此您将作为对象访问该对象。所有类名都使用大写的第一个字母,对象的名称不要与类的名称相同。也许可以将类myContract重命名为ControlImpl。

正如other提到的,您可以将其强制转换为myContract。但是,如果要在具有多个不同实现的多个实例上执行此操作,比在实例of之后将它们强制转换到其实现中更好的解决方案是在主方法中使用。

您有以下方法:

// TODO Auto-generated method stub
Contract myContract = new myContract();

//I can't call below method in child class
myContract.anotherMethod();
此代码段的最后一行未编译的原因是编译器无法看到.anotherMethod。您已经将myContract变量声明为Contract类型的对象。因此,即使您已使用新的myContract对其进行了实例化,也无法调用.anotherMethod,因为.anotherMethod在合同接口中不存在

有两种方法可以实现这一点:

将.anotherMethod签名添加到合同界面。如果您这样做,那么编译器将能够在上述代码段的最后一行看到它

将myContract变量声明为myContract类型,而不是Contract类型,这是您在上面声明的方式


除此之外,我强烈建议您遵循在camel case中命名类和接口的约定。这样,您可以通过将类名命名为MyContract,而将实例变量命名为MyContract来消除一些混淆。

这是代码气味。如果需要与MyContract实例交互,则静态类型应为MyContract。或者,如果接口确实属于该接口,您可以向其添加一个热方法,或者在使用它的地方向下投射,但向下投射表示存在设计问题。您没有为任何人提供足够的信息或上下文来建议正确的替代方案。您想要做的是破坏多态性的目的。见这一相关问题:
package test;

public class app {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Contract myContract = new myContract();

        //I can't call below method in child class
        myContract.anotherMethod();
    }

}
    Contract myContract = new myContract();

    if(myContract instanceof MyContract){
        ((MyContract)myContract).anotherMethod();
    }
// TODO Auto-generated method stub
Contract myContract = new myContract();

//I can't call below method in child class
myContract.anotherMethod();