【发布时间】:2012-02-02 00:43:25
【问题描述】:
我对 Java 泛型非常陌生,并且花费了大量时间寻找合适的解决方案(如果有的话)。
我正在尝试设计处理特定类型类对象的适配器。如下所述,CAdapter 类只处理“CClass”对象。我正在尝试提供一个抽象的通用适配器来处理大部分工作(很像 LinkedList 等 Java 集合)。然后,我为需要支持的每种类型提供了一个具体的适配器实现。
// Classes
public interface AInterface {
public String toString();
}
public class BClass extends AInterface {
public String toString() { return "BClass "; }
}
public class CClass extends AInterface {
public String toString() { return "CClass"; }
}
// Adapters
public interface AdapterInterface<T extends AInterface> {
public T getInterface();
}
public class BAdapter implements AdapterInterface<BClass> {
private BClass aInterface = null;
public BClass getInterface() { return aInterface; }
}
public class CAdapter implements AdapterInterface<CClass> {
private CClass aInterface = null;
public CClass getInterface() { return aInterface; }
}
首先,我读到为这样的通用适配器提供一个具体的实现是不受欢迎的(关于上帝杀死一只小猫的事情)!也许有人可以对此进行扩展?
其次,我遇到了动态实例化适配器并且没有 Java 编译器抱怨的问题。比如我有方法:
public <T extends AInterface> AdapterInterface<T> getAdapter(String type) {
AdapterInterface<T> result = null;
if (type.equals("C") {
result = new CAdapter();
}
return result;
}
当然,编译器会抱怨 CAdapter not matching 。给定任何类型的 AInterface 对象,我希望能够加载正确的适配器并适当地处理它。为了实现这一点,我无法理解工厂模式。
任何想法将不胜感激。
【问题讨论】:
-
你在调用 foo.
getAdapter(C) 吗?否则 T 是未绑定的。更常见的模式是 public AdapterInterface getAdapter(Class clazz); -
您必须为杀死小猫的部分提供一些背景信息。如果我们不知道互联网上的某个人实际上说了什么,我们就无法告诉您他是对还是错。
-
@Nialscorva 这并不重要。无论您是否提供类型标记,类型系统都无法证明约束。当方法签名类似于
<T> T getWhateverOfType(Class<T> type)时,类型标记很有用,因为Class.newInstance()、Class.cast()等。如果您不处理给定类的实例,它们就没有用。 -
@Nialscorva 即如果您可以将
AdapterInterface<CClass>.class传递给方法参数,这将有所帮助,但如果没有超类型标记,这是不可能的。 (而且我认为它们实际上不会帮助解决这里的问题,而不是静态地使代码类型安全。) -
当我看到
AdapterInterface中的代码时,我要做的第一件事就是在浏览器中打开Langer's Generics FAQ
标签: java generics design-patterns