繁体   English   中英

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

[英]Generic method works with different actual parameter

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

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

现在,如果我像下面这样调用这个方法

compare(10, "");

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

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

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

你得到编译时错误。

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

您的方法将编译,而不是在运行时抛出任何异常。

原因是:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM