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