Java 泛型方法适用于不同的实际参数
这里有一个泛型方法,它接受泛型类型参数Java 泛型方法适用于不同的实际参数,java,generics,Java,Generics,这里有一个泛型方法,它接受泛型类型参数T public static <T> boolean compare(T p1, T p2) { return p1.equals(p2); } 它可以工作,但我认为它不应该工作,因为它只能接受一种类型的类型参数,所以推断算法在这里是如何工作的?您的方法将编译,并且在运行时不会抛出任何异常 原因是: 将阻止JVM在运行时知道您的参数化类型,并且由于您没有绑定参数化类型(例如T extends CharSequenc
T
public static <T> boolean compare(T p1, T p2) {
return p1.equals(p2);
}
它可以工作,但我认为它不应该工作,因为它只能接受一种类型的
类型参数
,所以推断算法在这里是如何工作的?您的方法将编译,并且在运行时不会抛出任何异常
原因是:
- 将阻止JVM在运行时知道您的参数化类型,并且由于您没有绑定参数化类型(例如
等),因此任何T extends CharSequence
和“boxable”原语都将在调用期间编译为参数对象
- 在这种情况下,对参数调用
相当于调用equals
,因此不会引发运行时异常<当参数之间的引用不相等时,将返回code>falseObject#equals
true
如果使用共享相同值的对象(例如,两个相等的
字符串
s)调用方法,它将返回true
,因为整数和字符串具有公共父对象,并且您没有在类型T中指定任何约束。如果您写入:
public static <T extends Number> boolean compare(T p1, T p2) {
return p1.equals(p2);
}
公共静态布尔比较(tp1,tp2){
返回p1等于(p2);
}
您得到了编译时错误。方法调用之所以有效,是因为您没有约束类型
t
,而且String
和Integer
都是java.lang.Object
的子类型,即将要推断的类型 你不能只打印出方法中p1和p2的类型吗?@takendark它打印第一个参数为java.land.Integer
,第二个参数为java.lang.String
。很有趣。我猜那是来自getClass().getName()
。谢谢你的回答,我怀疑@eatleepCode在这个精确的上下文中有什么区别,没有技术上的区别,只有功能上的区别?
是任何类型的通配符,而T
是可重复使用的类型定义,由扩展限定或不限定…
。如果使用?
,则不能在方法参数列表、正文或返回类型中声明t
s,这通常会限制您的功能。类型擦除与此无关。如果我们对泛型进行了具体化,这也会起作用。@newact我没有说过类型擦除是导致这种行为的原因。这是一条互补的信息。@Mena:这不是互补的。这完全无关。
public static <T extends Number> boolean compare(T p1, T p2) {
return p1.equals(p2);
}