这里我有一个接受泛型类型参数T
public static <T> boolean compare(T p1, T p2) {
return p1.equals(p2);
}
现在,如果我将此方法称为如下
compare(10, "");
它有效,但我认为它不应该工作,因为它只能接受一种Type parameter
类型,那么推理算法如何在这里工作?
答案 0 :(得分:2)
它的工作原理是因为Integer和String有共同的父对象,你没有在类型T中指定任何约束。如果你写:
public static <T extends Number> boolean compare(T p1, T p2) {
return p1.equals(p2);
}
你得到编译时错误。
答案 1 :(得分:2)
方法调用有效,因为您还没有约束类型T
,因为String
和Integer
都是java.lang.Object
的子类型这将被推断。
答案 2 :(得分:0)
您的方法将编译并且不会在运行时抛出任何异常。
原因是:
T extends CharSequence
等),所以Object
和“boxable” “primitive将在调用期间编译为参数equals
等于调用Object#equals
,因此不会抛出运行时异常。将返回false
,因为您的参数之间的引用不相等如果使用共享相同引用的对象调用方法,它将打印true
。
如果您使用共享相同值的对象调用您的方法(例如两个相等的String
s),它将返回true
。