【发布时间】:2014-08-31 17:58:28
【问题描述】:
我喜欢有一个 java.util.Map,它包含不同的通用类对象。在我的情况下,这样的处理程序:
public interface Handler<s>{
public void encode (S data, OutputStream out);
public S decode (InputStream in, long length);
}
我有实现类,例如:
public class SpecializedHandler implements Handler<FirstSpecialItem>{
public void encode (SpecialItem data, OutputStream out){
// do something
}
public SpecialItem decode(InputStream in, long length){
// do something
}
}
和另一个实现 Handler 的类。
对于 FirstSpecialItem 和 SecondSpecialItem 存在一个父类 AbstractSpecialItem。
因为我已经在使用encode和decode时遇到了很多问题,所以我最终得到了以下地图,它可以使用decode和encode如下:
Map<Long, Handler<? super AbstractSpecialItem>> handlers;
// I can use it as follows
AbstractSpecialItem item = new FirstSpecializedItem();
handlers.get(1L).encode(item,System.out);
AbstractSpecialItem returnVal = handlers.get(1L).decode(System.in, 100L);
但是,我无法通过添加不同的 Handler 实现来创建地图,例如:
SpecializedHandler a = new SpecializedHandler();
SpecializedSecondHandler b = new SpecializedSecondHandler();
Map<Long, Handler<? super AbstractSpecialItem>> handlers = new HashMap<Long,Handler<? super AbstractSpecialItem>>();
handlers.put(0L, a); // does not work
handlers.put(1L, b); // does not work
Eclipse 总是说这些值不适用于地图。 我认为这种行为是有效的,并试图更好地理解泛型和 PECS 原理(通过网络和一些书籍查看)。但我还是不明白,想办法解决。我有带有特殊泛型类型的处理程序类,并且能够使用方法(编码、解码)以及创建处理程序映射。
【问题讨论】:
-
试试
Map<Long, Handler<? extends AbstractSpecialItem>>。