Java 不同类型的泛型

Java 不同类型的泛型,java,generics,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

对不起,这个问题可能很简单,但我在网上找不到答案

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);
}}
公共类主{
公共静态void main(字符串[]args){
INTA=1;
双b=2;
max(a,b);
}
公共静态无效最大值(E第一,E第二)
{
System.out.println(第一);
系统输出打印项次(秒);
}}
当我们将第一个参数设为整数时,E被设为整数,然后我们向它传递一个double。我们应该得到一个编译错误。(因为E是整数)但程序运行正确,输出为

一,

2.0


那么我的错误是什么呢?

Java找到了您的参数共享的最具体的类型。在本例中,应该是。

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

<? extends Number> void Main.max(? extends Number first, ? extends Number second)
您将看到一个
Integer
和一个
Double
被传递给该方法:

1
2.0
class java.lang.Integer
class java.lang.Double

根据我的理解,有两件事。一个是泛型类,另一个是泛型方法。在这两种情况下,都可以传递任何类型的值(无论类型如何),也可以传递任何类型的参数。现在,当您创建一个特定泛型类类型的对象(如
MyClass
itsnotmore-generic)时,您可能会在使用不同类型的参数执行操作时遇到编译器错误。但当您有一些方法,比如将元素添加到
列表中时,您可以向该列表中添加任何内容,您不会得到任何编译错误

我会认为整数被提升为双精度,但我不是100%确定。打印每个参数的类型(
.getClass()
)并查看。
Integer
Double
这两个子类型都来自
Number
、来自
Serializable
和来自
Object
。其中任何一个都可以用作泛型类型
E
。请注意,当我尝试它时,用于装箱的实际类是
Integer
Double
,因此
E
的类型可能是
Number
,但实际类是更(大多数?)特定的类型。
1
2.0
class java.lang.Integer
class java.lang.Double