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

gar*_*may 3 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));

    }

}
Run Code Online (Sandbox Code Playgroud)

但是如果我更换<T,V extends T><T extends Comparable<T>, V extends T>该行为是按预期.

Ale*_*you 6

在Java 5/6/7中,传递Integeras TStringas V这样的泛型方法会导致"绑定不匹配"编译器错误,除非您明确地将第一个参数强制转换为Object.

在Java 8,由于改进的类型推断,以满足关系TV所提供的参数,T推断为? extends Object,它允许VString,不导致的误差.

当你限制时<T extends Comparable<T>, V extends T>,没有这种类型的组合,T并且V可以满足Integer并且String- 即使T属于尽可能宽的类型Comparable<Integer>,它也不是超类型String.因此,您将按预期获得编译器错误.