Mic*_*onk 5 java generics design-patterns
我对 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; }
}
Run Code Online (Sandbox Code Playgroud)
首先,我读到为这样一个通用适配器提供一个具体的实现是不受欢迎的(关于上帝杀死一只小猫的事情)!也许有人可以对此进行扩展?
其次,我遇到了动态实例化适配器并且没有让 Java 编译器抱怨的问题。例如,我有这样的方法:
public <T extends AInterface> AdapterInterface<T> getAdapter(String type) {
AdapterInterface<T> result = null;
if (type.equals("C") {
result = new CAdapter();
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
当然,编译器会抱怨 CAdapter 不匹配。给定任何类型的 AInterface 对象,我希望能够加载正确的适配器并对其进行适当的处理。为了实现这一点,我无法理解工厂模式。
任何想法将不胜感激。
我的回答有点多余,但是:
任何带有 <T> 的内容都意味着“我的调用者知道这个类型是什么,但我不知道”。所以
AdapterInterface<T> result = null;
Run Code Online (Sandbox Code Playgroud)
意思是“我实际上不知道结果是什么类型,它是我的调用者认为的任何类型”。编译器对此抱怨:
result = new CAdapter();
Run Code Online (Sandbox Code Playgroud)
因为这段代码不能假设 T 是 CClass。
事实上,如果不进行强制转换,就无法做到这一点(将方法声明为通配符仅意味着您需要在调用它的地方强制转换结果)。强制转换是您告诉编译器“我知道您无法知道这是什么,没关系:我知道。相信我。冷静点。”的方式。是的,您会收到警告。没关系。
泛型并不能消除所有类型转换,但它们允许您只执行一次。您不需要到处进行强制转换,而是只需要在您(编码人员)确定您正在玩类型游戏的地方进行强制转换。所有其余的代码(使用您刚刚创建的适配器的 suff)都可以安全地使用泛型类型。
| 归档时间: |
|
| 查看次数: |
2487 次 |
| 最近记录: |