gpt4 book ai didi

Java 泛型在方法的返回类型之前限制通配符的使用

转载 作者:行者123 更新时间:2023-11-30 06:40:39 25 4
gpt4 key购买 nike

在下面的类中,在方法 m1 中,提到 K extends Runnable 真的有用吗?在方法返回类型之前?除了 Collection<K> 以外,我不能返回无论如何。如果我想返回 Runnable 的任何子类,我会指定这样的方法,

static <T> Collection<? extends Runnable> m1(ArrayList<T> l)

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<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;
}

该方法返回与字段相同的东西,但因为它是一个方法,调用者可以使用它来生成任何类型的通用类型列表(而字段不能像这样灵活)。

那里有一个未经检查的转换(带有警告),但由于列表是空的,我们(与编译器不同)知道它是安全的。

关于Java 泛型在方法的返回类型之前限制通配符的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57636514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com