[英]Java Generics bounded wild card usages before the return type of a method
在下面的类中,在方法m1中,在方法返回类型之前提及K extends Runnable
真的有用吗? 无论如何,我不能返回Collection<K>
以外的任何东西。 如果我想返回Runnable的任何子类,我会指定类似的方法,
static <T> Collection<? extends Runnable> m1(ArrayList<T> l)
在方法返回类型之前, K extends Runnable
是否K extends Runnable
? 我也没有此代码的编译错误
public class MainClass {
public static void main(String[] args) {
ArrayList<Thread> l = new ArrayList<>();
l.add(new Thread());
l.add(new Thread());
m1(l);
}
static <T, K extends Runnable> Collection<K> m1(ArrayList<T> l) {
ArrayList<K> r = new ArrayList<>();
return r;
}
}
通过使用参数K
,您可以让调用者决定要返回的集合类型:
public class Test {
static <T, K extends Runnable> Collection<K> m1(ArrayList<T> l) {
ArrayList<K> r = new ArrayList<>();
return r;
}
static void callingIt(){
ArrayList<?> list = new ArrayList<>();
Collection<Thread> threads = m1(list);
Collection<Runnable> runnables = m1(list);
Collection<MyTask> special = m1(list);
}
class MyTask extends Thread{}
}
如果您只有Collection<? extends Runnable>
Collection<? extends Runnable>
则调用者无法获取Collection<Thread>
。
但是除非K
连接到其他对象,否则我看不到除了空的结果列表外它是如何工作的(因为一旦您想向r
添加一些东西,就必须确保它是K
的实例)。
您可以在Collections.emptyList
看到此模式:
public static final List EMPTY_LIST = new EmptyList<>();
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
该方法返回与字段相同的东西,但是由于它是一种方法,因此调用者可以使用它来生成任何类型的通用类型的列表(而该字段不能像这样灵活)。
那里有一个未经检查的强制转换(带有警告),但是由于列表为空,我们(与编译器不同)知道它是安全的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.