假设我有两个类A
和B
,使B extends A
分别实现具有相同输入参数类型的方法getA
和getB
和相同的返回类型(但不同的名称)。在方法public static <T extends A> void print(T t)
获取类型为A
或B
的对象的输入时,如果对象的类型为getA
或{{{}},我想调用A
1}}如果对象的类型为getB
。
如果我可以修改B
和A
的代码,我会让他们实现提供B
的接口I
(在getValue()
的实现中A
,B
会调用getA()和getB()resp。),然后从getValue()
调用此方法。问题是: A类和B类不可修改!。没有方法可以添加或更改,它们的类层次结构是固定的,我没有编写他们的代码,我也没有访问源。
请注意,这也适用于以下情况 - 出于任何原因 - 我不想更改print()
和A
的代码。
有没有办法在不使用B
的情况下这样做?
以下是使用instanceof
(不好!)的解决方案。
instanceof
}
答案 0 :(得分:5)
当您因任何原因无法访问原始代码时,您最终不得不依赖于instanceof之类的东西。在这些情况下,它本身并不坏 - 你的双手被捆绑。
我要做的是创建一个在你的T上通用化的包装类,给它一个getValue
,用你提出的instanceof
进行测试,并明确指出这个类存在的原因是为了使用A或B提供一致的界面。它仍然很严重,但你已经在一个地方包含了粗略。
答案 1 :(得分:3)
要扩展Matt's answer,我会考虑为这些类采用Facade Pattern。这意味着您创建一个单独的类(或两个)来包含所有这两个类所需的功能。这包括添加一种方法,正如马特建议的那样。
好处是您可以将应用程序与无法控制的API分离。如果您不需要原始库中的所有方法,您还有机会简化API。
答案 2 :(得分:0)
谢谢你和@Matt。猜猜这个绝对是最干净的方式。将提供不使用instanceof的完整代码:
public static void main(String[] args){
A a = new A();
B b = new B();
AWrapper aw = new AWrapper(a);
BWrapper bw = new BWrapper(b);
print(aw);
print(bw);
}
public static void print(Wrapper t){
System.out.println(t.getValue());
}
public static class A {
public String getA(){
return "A";
}
}
public static class B extends A {
public String getB(){
return "B";
}
}
public static interface Wrapper{
public String getValue();
}
public static class AWrapper implements Wrapper{
A a;
public AWrapper (A a){
this.a = a;
}
public String getValue(){
return a.getA();
}
}
public static class BWrapper implements Wrapper{
B b;
public BWrapper (B b){
this.b = b;
}
public String getValue(){
return b.getB();
}
}