Как переменная типа допускает неправильный тип?

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);
    }
}

при запуске, следующий результат:

class java.lang.Integer
class java.lang.String

Как A иметь тип Integer, если он уже ограничен верхним значением String?

Пожалуйста, объясните мне об этом.

Ответ 1

Две вещи здесь:

  • существует простое решение для "плохого" ввода: T не String, а Object. И Integer расширяет Object. Но учтите: это работает только с возможностями расширенного типа вывода Java8. С Java7 ваш вход не будет компилироваться!
  • заблуждение на вашем конце: getClass() происходит в время выполнения и поэтому возвращает определенный класс переданных объектов - независимо от того, что компилятор думает о дженериках во время компиляции.