如何在Java中引用使用通配符标识的类的类?

use*_*415 0 java generics class wildcard

例如,假设我想编写一个方法来切换列表的前两个元素,但前提是第二个元素大于第一个元素.我最初尝试做类似的事情:

static void swapFirstTwo(List<? extends Comparable> list) {
    if(list.get(0).compareTo(list.get(1)) > 0) {
        ? temp = list.get(0);
        list.set(0, list.get(1));
        list.set(1, temp);
    }
}
Run Code Online (Sandbox Code Playgroud)

显然这不起作用,但我该怎么做呢?我可以替换?使用Object,但那不好,因为我必须在之后进行类型检查以确保一切都安全.

T.J*_*der 5

您可以预先提供类型,然后使用它:

static <T extends Comparable> void swapFirstTwo(List<T> list) {
// ----^^^^^^^^^^^^^^^^^^^^^^------------------------^
    if(list.get(0).compareTo(list.get(1)) > 0) {
        T temp = list.get(0);
// -----^
        list.set(0, list.get(1));
        list.set(1, temp);
    }
}
Run Code Online (Sandbox Code Playgroud)

更多在泛型教程的有限部分.

正如user7所指出的那样,我们也希望将其约束Comparable:

static <T extends Comparable<T>> void swapFirstTwo(List<T> list) {
// -------------------------^^^
Run Code Online (Sandbox Code Playgroud)

  • 如果你只有'Comparable`(原始类型),你会得到一个未经检查的警告 - 最好有`Comparable <E>`或`Comparable <?超级E>` (2认同)