1

我正在做的部分事情涉及一个具有两个泛型类型参数(T1、T2)和一个参数的函数,它是一个集合。我需要获取一个子集合或集合的子列表,其中包含实现或继承自/扩展 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 中的泛型类型。

感谢您的帮助^_^

4

2 回答 2

3

进行此检查的唯一方法instanceof是传递Class表示 的对象type

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

        for (T1 i : collection) {
            if (type.isAssignableFrom(i.getClass())) {
                sublist.add((T2) i);
            }
        }


    }
于 2013-09-23T04:36:41.877 回答
-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 下方的类型层次结构,编译器将抛出编译时错误

于 2013-09-23T04:34:43.310 回答