为什么这段代码会编译? (java泛型方法)

时间:2014-12-22 19:49:51

标签: java wildcard generic-method

以下代码:

import java.util.*;

public final class JavaTest {
    public static <T extends Comparable<? super T>> int max(List<? extends T> list, int begin, int end) {
        return 5;
    }

    public static void main(String[] args) {
        List<scruby<Integer>> List = new ArrayList<>();
        JavaTest.<scruby>max(List, 0, 0); //how does this compile?, scruby doesn't meet
        //T extends Comparable<? super T>
    }
}

class scruby<T> implements Comparable<String>{
    public int compareTo(String o) {
        return 0;
    }
}

语句JavaTest.max(List,0,0)如何编译?如何擦洗

T extends Comparable <? super T>

它实现了Comparable<String>,它不是超级类型的擦洗?如果将其更改为scruby<Integer>,则无法编译并提供错误。那为什么现在要编译呢?为什么raw类型编译?

1 个答案:

答案 0 :(得分:3)

JavaTest.<scruby>max(List, 0, 0);

scruby是原始类型。这抑制了一些类型检查。

您应该添加所有必需的类型参数:

JavaTest.<scruby<Integer>>max(List, 0, 0);

或者让Java推断它们:

JavaTest.max(List, 0, 0);