对不起,这个问题可能很简单,但是我没有在互联网上找到答案。
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
那我的错误是什么?
答案 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>
中时,可以在此列表中添加任何内容,而不会出现任何编译错误。