假设我有两个班A,并B使得B extends A分别实现方法getA,并getB具有相同的输入参数类型和相同的返回类型(但不同的名称).在方法public static <T extends A> void print(T t)得到作为输入类型的对象A或B,我想调用getA如果对象是类的A或者getB如果对象是类的B.
如果我能编辑的代码A和B我想使他们实现一个接口I提供getValue()(在实施A和B,getValue()会叫木屐()和getB()RESP),然后调用此方法print().问题是:A类和B类不可修改!.没有方法可以添加或更改,它们的类层次结构是固定的,我没有编写他们的代码,我也没有访问源代码.
请注意,这也适用于案件的时候-以任何理由-我不希望改变的代码A和B.
有没有办法在没有使用的情况下这样做instanceof?
以下是使用instanceof(坏!)的解决方案.
public class Test {
public static <T extends A> void print(T t){
if (t instanceof B)
System.out.println(((B)t).getB());
else if (t instanceof A)
System.out.println(t.getA());
}
public static class A {
public String getA(){
return "A";
}
}
public static class B extends A {
public String getB(){
return "B";
}
}
Run Code Online (Sandbox Code Playgroud)
}
当您因任何原因无法访问原始代码时,您最终不得不依赖于instanceof之类的东西.在这些情况下,它本身并不坏 - 你的双手并列.
我要做的是创建一个在你的T上通用化的包装类,按照你的建议给它一个getValue测试instanceof,并明确表示这个类存在的唯一原因是提供一个一致的接口来使用A或a B.它仍然很严重,但是你已经在一个地方包含了粗糙度.