关于java中的泛型转换

关于java中的泛型转换,java,generics,types,casting,Java,Generics,Types,Casting,在Java中,大家都知道整数不能转换为字符串,这在编译时是一个错误 现在,对于这个一般情况 public <T> T cast(Object o) { return (T) Integer.class.cast(o);//cast Integer to T } void method1() { String q = cast("q"); //T is String }

在Java中,大家都知道整数不能转换为字符串,这在编译时是一个错误

现在,对于这个一般情况

        public <T> T cast(Object o) {
            return (T) Integer.class.cast(o);//cast Integer to T
        }

        void method1() {
            String q = cast("q"); //T is String
        }
publictcast(对象o){
返回(T)Integer.class.cast(o);//将整数转换为T
}
void method1(){
字符串q=cast(“q”);//T是字符串
}
我只是不明白为什么在这种情况下,java不能在编译时警告您整数被转换为字符串。为什么?据我所知,类型擦除是在编译之后发生的

编辑:我只是认为编译器有类型推断来知道T是字符串,所以整数不能转换为。但显然不是这样。

public <T> T cast(Object o) {
     return (T) Integer.class.cast(o);//cast Integer to T
}
然后您将非常容易地得到编译错误,因为
CharSequence
Integer
不在同一继承层次结构中,因此不兼容

在这种特定情况下,即使没有转换到
T
,也会出现编译错误。这是因为

AnyTypeName.class 

始终返回
,并且
类#cast
使用泛型类型。在这种情况下,它将返回一个
整数
,而
整数
不能转换为
T

,更确切地说,我的问题是编译器有类型推断来知道T是字符串,因此在这个意义上,整数不能转换为字符串。但显然出了问题。方法绑定是动态的。编译
cast(“q”)
时,编译器只会查看方法签名,而不会查看方法内部。@superChing它只知道该特定调用的
String
。其他调用呢?
AnyTypeName.class