我无法理解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();
}
}
答案 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接口中不存在。
有两种方法可以完成这项工作:
添加" .anotherMethod()"签名到Contract接口。如果你这样做,那么编译器将能够"看到"它位于上面代码段的最后一行。
宣布您的" myContract"变量是myContract类型(而不是类型"契约",这是你在上面声明的方式。
除此之外,我强烈建议您遵循以驼峰为例命名类和接口的约定。这样,您可以通过让类名为" MyContract"来清除一些混淆,但实例变量的名称为" myContract"。
答案 3 :(得分:-1)
您与命名有冲突。您正在创建一个名为" myContract"的类,以及一个对象" myContract"。由于作用域(对象在范围内),您将作为对象访问对象。对所有类名使用大写第一个字母,并且不要为对象使用相同的名称。 (也许将类myContract重命名为ControlImpl)。