方法不适用于泛型方法参数

时间:2014-08-23 21:56:31

标签: java generics generic-list

如果我将?更改为Object代码编译 Q1。有没有办法更改unwind方法签名以适用于<?> getList()
Q2。如果没有,您是否听说过使用<?>设计参数化API的设计原则?

public class Main {
    public static void main(String[] args) {
        unwind(getList());
    }

    public static List<List<?>> getList() {
        return new LinkedList<List<?>>();
    }

    public static<T> Collection<T> unwind(Collection<? extends Collection<T>> collection) {
        return collection.iterator().next();
    }
}

PS。我一直坚持处理几次打电话给Future<?> java.util.concurrent.ExecutorService.submit(Runnable task)的结果 对我来说,获得该方法的Future<Object>结果要好得多。这里的API设计有什么问题吗?

2 个答案:

答案 0 :(得分:1)

我仍然不确定这是什么。使用泛型,您必须对类型非常具体。你说你正试图理解“利弊”。代码不起作用,至少不是这个代码。这完全取决于你想要做什么。

一种可能的解决方案是滥用@SuppressWarnings("unchecked")

  List<List<Future<?>>> llist = getSomething( x );      
  @SuppressWarnings( "unchecked" )
  Collection<?> cx = llist;

另一种方法是确保您的通用类型匹配100%。但我仍然不知道你究竟想做什么。这是吗?

   public static List<List<Future<?>>> getSomething( Future<?> x ) {
      List<List<Future<?>>> llist = new ArrayList<>();
      List<Future<?>> list = new ArrayList<>();
      list.add( x );
      llist.add( list );
      return llist;
   }

   public static <t> Collection<t> unwind( Collection<? extends Collection<t>> c ) {
      return c.iterator().next();
   }

   public static void main(String[] args) {
      Future<?> x = null;
      List<List<Future<?>>> llist = getSomething( x );
      Collection<Future<?>> clist = unwind( llist );
   }

答案 1 :(得分:1)

通配符限制了你使用geenrics的方式。它说它可以接受任何类型。再说,因为它是任何类型你可能无法添加对象,有点制作它们read only

所以

List<?> list = new ArrayList();
list.add("String"); // compile time error,it is read only

如果没有将通配符显式地转换为另一种通用类型,那么唯一使用通配符类型的方法是将其用作只读类型(读取集合的对象,因为每种类型都是对象)

public void method1(List<?> list){

Object obj = list.get(0);

}

由于您的 unwind method 采用了 Collection of Collection of type T(a specific Type) ,因此未知类型的列表列表不适用于类型T

我认为您需要在程序中进一步从unwind()方法(Collection of type T)返回结果,因此您应该使getList()方法通用并在程序中进一步使用它。

public class Main {
    public static void main(String[] args) {

        Collection<String> val = Main.unwind(Main.<String>getList());

       }

    public static <T> List<List<T>> getList() {
        return new LinkedList<List<T>>();
    }

    public static<T> Collection<T> unwind(Collection<? extends Collection<T>> collection) {
        return collection.iterator().next();
    }
}