假设我的班级Context是这样的.
public class Context {
Set<A> sA;
Set<B> sB;
Set<C> sC;
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个泛型类Performer,它希望基于类中的泛型类型执行操作Context,方法如下 - 在Java中不可能.
public class Performer<T> { // T can be type of A,B or C
public void saveToSet(T t) {
Context.Set<T>.add(t);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,如果我说出类似的话saveToSet(B b),Context将调用右边的集合,在这种情况下sB (Set<B>),新实例将被添加到该集合中.
好的,问题......在Java中怎么做?:d
遗憾的是,由于类型擦除,这种方法在Java中不起作用.
基本上所有的运行时都会看到Context.Set<java.lang.Object>.add(t);并且你的字段崩溃为Sets的java.lang.Objects,因此它将无法消除歧义.
你可以解决这个写重载一样saveToSet(A a),saveToSet(B b)等等.
在许多方面,包括这个,Java泛型是C++模板的穷表兄弟.
| 归档时间: |
|
| 查看次数: |
266 次 |
| 最近记录: |