类型变量如何允许错误类型?

Atu*_*ul 11 java generics object upperbound type-variables

package org.my.java;

public class TestTypeVariable {

    static <T,A extends T> void typeVarType(T t, A a){
        System.out.println(a.getClass());
        System.out.println(t.getClass());
    }

    public static void main(String[] s){
        int i= 1;
        typeVarType("string", i);
    }
}
Run Code Online (Sandbox Code Playgroud)

运行时,以下是输出:

class java.lang.Integer
class java.lang.String
Run Code Online (Sandbox Code Playgroud)

如何才能A成为类型Integer时,它已经被上界来String

请解释我.

Gho*_*ica 15

这里有两件事:

  • 对于"坏"键入有一个简单的解决方案:T不是String而是Object.并且Integer扩展了Object.但请注意:这仅适用于Java8的"增强"类型推断功能.使用Java7,您的输入将无法编译!
  • 结束getClass()时的误解:在运行时发生,因此返回传递的对象的特定类 - 独立于编译器在编译时对泛型的看法.

  • 它在Java 8中编译得很好,但是在Java 7中没有通过编译.在这种情况下,我认为它更有意义的是它不通过编译,因为`<T,A扩展T>`没有意义(由于类型擦除). (2认同)