2014-12-22 97 views
4

下面的代码:为什么这个代码编译? (Java的泛型方法)

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(列表,0,0)编译?如何scruby满足

T extends Comparable <? super T> 

它实现Comparable<String>这是不是一个超级型scruby的?如果将其更改为scruby<Integer>,它将不会编译并发出错误。那么为什么现在编译?为什么原始类型编译?

+0

不能看到有人downvoting这点?至少对我来说,这似乎是合法的问题。 –

+2

不,它没有扩展'String'它扩展'Integer'因为'List > List = new ArrayList <>();'然后它没有使用它的'implements Comparable '它使用的方法是[ compareTo](http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#compareTo(java.lang.Integer))继承自'Integer'的方法 – chancea

+0

对不起,我的意思是它实现可比较的和字符串不是scruby的超级用户。它如何从Integer继承任何东西? – nhooyr

回答

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

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

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

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

或者只是让Java的推断他们:

JavaTest.max(List, 0, 0); 
+0

哦,那是因为它是原始类型,它只是不检查? O.O 有趣,谢谢你的帮助! – nhooyr

+1

是的。基本上,只要引入一个原始类型,除了警告之外,所有与其相关的泛型类型检查都会被抑制,并且检查会被放到运行时间,就像在泛型之前的那些日子一样。请记住,Java期望使用原始类型仅限于旧的旧版代码。 – RealSkeptic