我有两个实现相同但名称不同的类。它们是生成的,我无法修改它们:
public class Foo {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Bar {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我需要用数据填充这些类,因为它们是相同的,所以我更愿意用单个类或引用来完成,然后根据需要转换为(或者希望解决方案更优雅)Foo 或 Bar。概念上:
FooOrBar fob = ????;
fob.setName("XYZ");
Foo f = fob.(???);
Bar b = fob.(???);
我研究过泛型,但它似乎适用于当您真的不知道您将在哪个类上操作时。我是否有可能拥有某种类型的类或引用来实现这一点?
7 月 26 日编辑:
如果这样的跟进形式不好,我深表歉意,如果需要,我可以发布新的。我正在实现 Tomasz 的适配器模式,但我的最后一步与他的不同。我需要对接口(interface)对象进行条件分配。以下是我所拥有的,到目前为止我没有收到任何错误或警告,但我想知道这是否出于某种原因不是一个好的做法?也许我应该使用反射或泛型来确定接口(interface)的类?这将是一种只有我的代码会调用并且我会知道条件的方法。我搜索了条件接口(interface)分配,但搜索不多。
FooOrBar fob; //interface
if (condition true) {
fob = new FooAdapter(); //FooAdapter implements FooOrBar
} else {
fob = new BarAdapter(); //BarAdapter implements FooOrBar
}
fob.setName("XYZ");
最佳答案
你要找的是duck-typing并且在 Java 中不受支持。试试像 groovy 这样的动态语言和 jruby .
在 Java 中,假设您不能修改 Foo
和 Bar
,您将需要一个 Adapter 模式。首先在 Foo
和 Bar
上创建一个抽象:
public interface FooOrBar {
String getName();
void setName(String name);
}
并且有两个这样的适配器(BarAdapter
几乎相同):
public class FooAdapter implements FooOrBar {
private final Foo foo;
public FooAdapter(Foo foo) {
this.foo = foo;
}
public String getName() {
return foo.getName();
}
public void setName(String name) {
foo.setName(name);
}
}
现在你可以说:
FooOrBar fob = new FooAdapter(foo);
FooOrBar fob2 = new BarAdapter(bar);
fob.setName("XYZ");
我会把提取实际值留给你(你真的需要它吗?)
关于java - 如何实现对两个相同类的一个引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11655620/