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

时间:2016-03-17 21:08:04

标签: java

我无法理解Java中有关继承和多态的一些基本概念。

我正在尝试仅为子类调用实现给定父接口的子类。但是,当我实例化子类对象并将其放在父类接口中时,我无法调用这些仅用于子类的方法。如何在不影响多态性的情况下这样做。

Contract.java

package test;

public interface Contract {

    void getLog();
}

myContract.java

package test;

public class myContract implements Contract {

    public void getLog()
    {
        System.out.println("logging in myContract");
    }

    public void anotherMethod()
    {
        System.out.println("another method");
    }
}

app.java:

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();
    }

}

4 个答案:

答案 0 :(得分:0)

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

    Contract myContract = new myContract();

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

答案 1 :(得分:0)

正如其他人所说,你可以把它投射到MyContract。但是,如果您想在多个实例上执行此操作,这些实例可以有多个不同的实现,那么比在实例后将它们强制转换为实现更好的解决方案是使用visitor pattern

答案 2 :(得分:0)

在你的主要方法中你有这个:

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

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

此代码段的最后一行未编译的原因是编译器无法查看""" " .anotherMethod()。"您已将myContract变量声明为Contract类型的对象。所以即使你用" new myContract()"来实例化它,你也无法调用" .anotherMethod()"因为" .anotherMethod()"在Contract接口中不存在。

有两种方法可以完成这项工作:

  1. 添加" .anotherMethod()"签名到Contract接口。如果你这样做,那么编译器将能够"看到"它位于上面代码段的最后一行。

  2. 宣布您的" myContract"变量是myContract类型(而不是类型"契约",这是你在上面声明的方式。

  3. 除此之外,我强烈建议您遵循以驼峰为例命名类和接口的约定。这样,您可以通过让类名为" MyContract"来清除一些混淆,但实例变量的名称为" myContract"。

答案 3 :(得分:-1)

您与命名有冲突。您正在创建一个名为" myContract"的类,以及一个对象" myContract"。由于作用域(对象在范围内),您将作为对象访问对象。对所有类名使用大写第一个字母,并且不要为对象使用相同的名称。 (也许将类myContract重命名为ControlImpl)。