繁体   English   中英

避免使用泛型在这个抽象工厂中降级

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM