猿问

不同类型的泛型

抱歉,这个问题可能很简单,但是我没有在互联网上找到答案。


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


那我的错是什么?


慕标琳琳
浏览 171回答 3
3回答

阿晨1998

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

小怪兽爱吃肉

如果将鼠标悬停在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){&nbsp; &nbsp; System.out.println(first);&nbsp; &nbsp; System.out.println(second);&nbsp; &nbsp; System.out.println (first.getClass ());&nbsp; &nbsp; System.out.println (second.getClass ());}您会看到anInteger和aDouble传递给了该方法:12.0class java.lang.Integerclass java.lang.Double

繁星点点滴滴

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

相关分类

Java
我要回答