泛型,V扩展T,即使不兼容的类型也没有错误

时间:2016-05-07 16:47:25

标签: java generics

我是仿制药的新手。我从下面的语法中理解的是V应该是T的相同或子类,但是这显示没有编译错误,即使V是整数而T String数组也返回False。

class GenMethDemo {

    public static <T ,V extends T> boolean isIn( T x, V[] y) {

        for ( int i =0; i< y.length; i++ ) 
            if ( x.equals(y[i]) ) return true;
        return false;

    }
}



public class App {

    public static void main(String[] args) {

        String b[] = {"are", "how", "YOU"};

        System.out.println(GenMethDemo.isIn(1, b));

    }

}

但是,如果我将<T,V extends T>替换为<T extends Comparable<T>, V extends T>,则行为符合预期。

1 个答案:

答案 0 :(得分:6)

在Java 5/6/7中,将Integer作为TString作为V传递给此类通用方法会导致&#34;绑定不匹配&#34;编译器错误,除非您明确地将第一个参数强制转换为Object

在Java 8中,由于improved type inference,为了满足TV之间关于提供的参数的关系,T被推断为? extends Object,这允许VString,不会导致错误。

限制为<T extends Comparable<T>, V extends T>时,TV类型的组合不能满足IntegerString - 即使{ {1}}属于尽可能宽的类型T,它不是Comparable<Integer>的超类型。因此,您按预期收到编译器错误。