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
    相当于调用
    Object#equals
    ,因此不会引发运行时异常<当参数之间的引用不相等时,将返回code>false
如果使用共享相同引用的对象调用方法,它将打印
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);
}