如何获取传递集合<generic type =“”>的子集合,其中成员扩展或实现另一个?</generic>

时间:2013-09-23 04:15:52

标签: java generics collections instanceof

我正在做的事情的一部分涉及一个带有两个泛型类型参数(T1,T2)的函数,以及一个参数,它是一个集合。我需要获得Collection的子集合或子列表,其中包含实现或继承/ extend T2的集合的所有成员。

我最初的想法就是以对我来说似乎显而易见的方式做到这一点:

<T1, T2> void someMethod(Collection<T1> collection)
{
    List<T2> sublist = new ArrayList<T2>();

    for(T1 i : collection)
        if(i instanceof T2)
            sublist.add((T2)i);
}

但是instanceof不能用于Java中的泛型类型。

感谢您的帮助^ _ ^

2 个答案:

答案 0 :(得分:3)

执行此instanceof检查的唯一方法是传递代表Class的{​​{1}}对象:

type

答案 1 :(得分:-1)

假设T1低于T2的类型层次结构,那么你可以像这样声明你的方法:

  <T2, T1 extends T2> void someMethod(Collection<T1> collection)
  {
      List<T2> sublist = new ArrayList<T2>();

      for(T1 i : collection)
              sublist.add(i);
  }

请注意,您不需要运行时检查i,因为如果T1未链接到T2下面的类型层次结构,编译器将抛出编译时错误