[英]Avoid downcast in this abstract factory using generics
我有以下物品
interface Adapter<T> {
T fromXml(XML xml);
XML toXml(T obj); //ignoring this in implementations
}
abstract class AbstractAdapter<T> implements Adapter<T>{
T fromXml(XML xml) { //template method
validate(xml);
return parse(xml);
}
abstract void validate(Xml xml);
abstract T parse(Xml xml);
}
class MyObjectAdapter extends AbstractAdapter<MyObject> {
MyObject parse(XMl xml) {return null;}
void validate(Xml xml) {}
}
class AnotherObjectAdapter extends AbstractAdapter<AnotherObject> {
AnotherObject parse(XMl xml) {return null;}
void validate(Xml xml) {}
}
class AdapterFactory {
Adapter<?> createAdapter(String objectType) {
if (objectType == "MyObject") return new MyObjectAdapter();
if (objectType == "AnotherObject") return new AnotherObjectAdapter();
}
public static void main(String args[]) {
AdapterFactory factory = new AdapterFactory();
//********
Adapter<MyObject> myobjectAdapter = (Adapater<MyObject>) factory.createAdapter("MyObject");
MyObject obj = myobjectAdapter.fromXml(getXml(args));
}
如何避免在上面标记为* *的行中进行向下转换? 需要适配器的对象之间没有任何关系,它们是通用数据对象。
您在String
有一个类名,而您正试图将其改成实际的类型。 那总是要涉及演员。 如果删除AdapterFactory
并因此删除String
,则没有问题。
(通常注意, String
==
上的==
通常不是您想要的。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.