不同类型的泛型

时间:2018-06-24 07:50:33

标签: java generics

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

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 个答案:

答案 0 :(得分:4)

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

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

即编译器将泛型类型参数的类型推断为扩展Number的内容。因此,扩展Integer的{​​{1}}和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 ()); } Integer传递给了方法:

Double

答案 1 :(得分:3)

Java的type inference algorithm查找您的参数共享的最特定类型。在这种情况下,应为Number

答案 2 :(得分:0)

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