如果我将?
更改为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设计有什么问题吗?
答案 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();
}
}