为了账号安全,请及时绑定邮箱和手机立即绑定

不同类型的泛型

不同类型的泛型

慕标琳琳 2021-04-06 16:13:26
抱歉,这个问题可能很简单,但是我没有在互联网上找到答案。public class Main {public static void main(String[] args) {    int a = 1;    double b=2;    max(a,b);}public static <E> void max(E first , E second){    System.out.println(first);    System.out.println(second);}}当我们将第一个参数设为整数时,将E设置为Integer,然后将double传递给它。我们应该得到一个编译错误。(因为E是Integer),但是程序正确运行,并且输出为1个2.0那我的错是什么?
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

Java的类型推断算法可以找到您的参数共享的最具体的类型。在这种情况下,它应该是Number。


查看完整回答
反对 回复 2021-04-21
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

如果将鼠标悬停在Eclipse中的方法调用上,则会看到:


<? extends Number> void Main.max(? extends Number first, ? extends Number second)

也就是说,编译器将泛型类型参数的类型推断为可扩展的内容Number。因此,这两个Integer和Double,延伸Number是用于有效参数max方法。


如果您打印传递给max方法的参数类型:


public static <E> void max(E first , E second)

{

    System.out.println(first);

    System.out.println(second);

    System.out.println (first.getClass ());

    System.out.println (second.getClass ());

}

您会看到anInteger和aDouble传递给了该方法:


1

2.0

class java.lang.Integer

class java.lang.Double


查看完整回答
反对 回复 2021-04-21
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

根据我的理解,有两件事。一种是泛型类,另一种是泛型方法。在这两种情况下,您都可以传递任何类型的值(无论类型如何),也可以传递任何类型的参数。现在,当您创建一个特定的通用激光类型的对象(MyClass<Integer>不再是通用的)时,使用不同类型的参数进行操作时会出现编译器错误。但是,当您有某种方法(例如将元素添加到)时List<E>,可以将任何内容添加到此列表中,都不会出现任何编译错误。


查看完整回答
反对 回复 2021-04-21
  • 3 回答
  • 0 关注
  • 170 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信