通用方法适用于不同的实际参数

时间:2015-08-17 12:01:01

标签: java generics

这里我有一个接受泛型类型参数T

的泛型方法
 public static <T> boolean compare(T p1, T p2) {
        return p1.equals(p2);
    }

现在,如果我将此方法称为如下

compare(10, "");

它有效,但我认为它不应该工作,因为它只能接受一种Type parameter类型,那么推理算法如何在这里工作?

3 个答案:

答案 0 :(得分:2)

它的工作原理是因为Integer和String有共同的父对象,你没有在类型T中指定任何约束。如果你写:

public static <T extends Number> boolean compare(T p1, T p2) {
    return p1.equals(p2);
}

你得到编译时错误。

答案 1 :(得分:2)

方法调用有效,因为您还没有约束类型T,因为StringInteger都是java.lang.Object的子类型这将被推断。

答案 2 :(得分:0)

您的方法将编译并且不会在运行时抛出任何异常。

原因是:

  • Type erasure将阻止JVM在运行时知道您的参数化类型,并且因为您没有绑定参数化类型(例如T extends CharSequence等),所以Object和“boxable” “primitive将在调用期间编译为参数
  • 在这种情况下,对参数调用equals等于调用Object#equals,因此不会抛出运行时异常。将返回false,因为您的参数之间的引用不相等

如果使用共享相同引用的对象调用方法,它将打印true

如果您使用共享相同值的对象调用您的方法(例如两个相等的String s),它将返回true