【问题标题】:Generic method that takes List in non generic class在非泛型类中采用 List 的泛型方法
【发布时间】:2012-06-23 22:43:19
【问题描述】:

我想做这样的事情

private <T extends List<?>> List<?> getFirstFiveElements(T list) {
    //body
}

但是,当我托盘传递参数时,它不起作用

List<A> a = new LinkedList<A>;
List<B> b = new LinkedList<B>; 
getFirstFiveElements(a);
getFirstFiveElements(b);

所以任何建议我如何使这项工作。

【问题讨论】:

  • private &lt;T&gt; List&lt;T&gt; getFirstNElements(Iterable&lt;T&gt; elements, int n) 这样的签名呢?更灵活且类型安全。
  • “它不工作”它是如何“不工作”的?错误?警告?

标签: java list generics methods


【解决方案1】:

以下应该可以正常工作。

private static <A, T extends List<A>> List<A> getFirstFiveElements(T list) {
   //
}

T 在这里没有用处,因此可以被淘汰。

private static <A> List<A> getFirstFiveElements(List<A> list) {
   //
}

如果您希望该方法返回与它所采用的相同类型(即 ArrayList 用于 ArrayListLinkedList 用于 LinkedList),那么很抱歉告诉您,Java's type system is not capable of that

【讨论】:

    【解决方案2】:

    太好了 2 秒后,我找到了魔法组合。无论如何,对于在这里偶然发现这一点的所有其他人来说,这对我有用

         private <T> List<T> getStart(List<T> list)
    

    【讨论】:

      【解决方案3】:

      这对我有用:

        import java.util.*;
      
        public class Test {
      
        private static <T extends List<?>> List<?> getFirstFiveElements(T list) {
          List<Object> result = new LinkedList<Object>();
          for (int i = 0; i < 5 && i < list.size(); i++) {
            result.add(list.get(i));
          }
          return result;
        }
      
        public static void main(String[] args) {
          List<Integer> a = new LinkedList<Integer>();
          a.add(1);
          a.add(2);
          a.add(3);
          a.add(4);
          a.add(5);
          a.add(6);
          a.add(7);
          System.out.println(getFirstFiveElements(a));
        }
      
      }
      

      【讨论】:

      • Hrm... 它对我有用(只需重新运行它)。什么版本的 Java?
      【解决方案4】:

      为什么要使用模板?使用这个还不够:

      private List<?> getFirstFiveElements(List<?> list) {
          //body
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 2021-02-16
        • 1970-01-01
        • 1970-01-01
        • 2021-11-04
        • 2017-07-14
        • 1970-01-01
        相关资源
        最近更新 更多