Java按泛型类型获取集合

zwi*_*ebl 6 java generics

假设我的班级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

Bat*_*eba 7

遗憾的是,由于类型擦除,这种方法在Java中不起作用.

基本上所有的运行时都会看到Context.Set<java.lang.Object>.add(t);并且你的字段崩溃为Sets的java.lang.Objects,因此它将无法消除歧义.

你可以解决这个写重载一样saveToSet(A a),saveToSet(B b)等等.

在许多方面,包括这个,Java泛型是C++模板的穷表兄弟.