这是我的代码想要使用AdapterVersion的对象引用(父类)访问AdapterVer1的子类方法getAdaptObj1()(没有类型转换)
abstract class AdapterVersion {
public abstract void getMObject();
public abstract void getCObject();
}
public class AdapterVer1 extends AdapterVersion {
@Override
public void getMObject() {
System.out.println("AdapterVer1 Mont");
}
@Override
public void getCObject() {
System.out.println("AdapterVer1 Conf");
}
public void getAdaptObj1() {
}
}
public class AdapterFactory {
public static void main(String []a){
AdapterFactory adapterFactory= new AdapterFactory();
AdapterVersion adpater = adapterFactory.getMyObject("ver1");
adpater.getAdaptObj1(); // Unable to do that
((AdapterVer1)adpater).getAdaptObj1(); // Working but DONT WANT THIS
}
public AdapterVersion getMyObject(String version){
if(version.equals("ver1")){
return new AdapterVer1();
}else{
return new AdapterVer2(); // another declared class
}
}
}
答案 0 :(得分:4)
你做不到。因为在编译时,编译器会检查您调用的方法是否在您正在使用的引用的类中是可访问的还是可见的。
因此,在这种情况下,由于引用是Parent
类,编译器将首先在Parent类中查找方法声明,以便成功编译代码。
请记住: -
编译器担心 Reference 类型,并且在运行时考虑实际的对象类型,以决定实际调用哪个方法。
您唯一的选择是进行类型转换,在这种情况下,编译器现在会查看您对其进行类型转换的类。其他选项是,您可以在Parent类中声明一个具有该名称的抽象方法,但是根据您的问题,您似乎明确没有这样做。
答案 1 :(得分:0)
您需要将方法声明移动到抽象类。
答案 2 :(得分:0)
罗希特已经很好地解释了它。只需添加我的2美分,您应首先检查子类类型然后进行类型转换,例如:
if(adapter instanceof Adapterver1) {
((AdapterVer1)adpater).getAdaptObj1();
}
这样,如果代码尝试处理未声明此类方法的新子类,则代码将更安全。
但是你必须问的问题是,如果你已经知道要调用哪个子类方法,为什么要从超类引用中访问它?