请考虑我们的代码如下:
Object obj = true ? new Integer(0) : new Long(1);
System.out.println(obj.getClass() + "\nvalue = " + obj);
Run Code Online (Sandbox Code Playgroud)
其结果是:
class java.lang.Long
value = 0
Run Code Online (Sandbox Code Playgroud)
代替:
class java.lang.Integer
value = 0
Run Code Online (Sandbox Code Playgroud)
有人可以澄清为什么我们在Java中有这样的功能吗?这对我来说很奇怪.你有什么例子可以用吗?
更新:这是一段字节码,我们可以看到,那里有什么
NEW java/lang/Integer
DUP
LDC "0"
INVOKESPECIAL java/lang/Integer.<init> (Ljava/lang/String;)V
INVOKEVIRTUAL java/lang/Integer.intValue ()I
I2L
INVOKESTATIC java/lang/Long.valueOf (J)Ljava/lang/Long;
ASTORE 1
Run Code Online (Sandbox Code Playgroud) 为什么会这样.如果我将匿名泛型类传递给类型确定方法 - 一切都很好.但是如果我在这个方法中传递对象 - 控制台输出是E.
public static void main(String[] args) {
printType(new ArrayList<Integer>() {});
printType(new ArrayList<Integer>());
}
public static void printType(final List<?> list) {
System.out.println(((ParameterizedType) list.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
}
Run Code Online (Sandbox Code Playgroud)
安慰:
class java.lang.Integer
E
Run Code Online (Sandbox Code Playgroud)
请向我解释.