Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型,V扩展T,即使不兼容类型也没有错误_Java_Generics - Fatal编程技术网

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

Java 泛型,V扩展T,即使不兼容类型也没有错误,java,generics,Java,Generics,我不熟悉泛型。我从下面的语法中了解到,V应该和T相同或是T的子类,但这并没有显示编译错误,即使V是整数而T是字符串数组,也返回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 tr

我不熟悉泛型。我从下面的语法中了解到,V应该和T相同或是T的子类,但这并没有显示编译错误,即使V是整数而T是字符串数组,也返回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));

    }

}
class-GenMethDemo{
公共静态布尔isIn(tx,V[]y){
对于(int i=0;i

但是,如果我将
替换为
,则行为与预期一样

在Java 5/6/7中,将
Integer
作为
T
String
作为
V
传递给此类泛型方法将导致“绑定不匹配”编译器错误,除非您显式地将第一个参数强制转换为
对象

在Java 8中,为了满足所提供参数的
T
V
之间的关系,
T
被推断为
?扩展对象
,它允许
V
成为
字符串
,而不会导致错误


当您限制为
时,没有类型
T
V
的组合可以满足
Integer
String
——即使
T
属于尽可能广泛的类型
compariable
,它也不是
String
的超类型。因此,您得到了预期的编译器错误。

T
在这种情况下被视为
对象
,因此
String[]
非常适合。那么泛型有什么用呢,不是为了强类型安全吗?至少在运行时,这应该显示一个错误,因为T现在是一个整数。还有为什么在使用可比接口时会导致错误。字符串和整数都是可比较的。回到您的示例:签名
静态布尔值isIn(tx,T[]y)
足够有效
equals()
在大多数情况下只适用于相同的类型。“因为T现在是一个整数”-
T
可以是
integer
,也可以是
可比较的
数字
可序列化的
对象
。选择
T
的具体类型时也考虑了其他参数的类型。