想象一下,我们有以下泛型类:
public class GenericClass<U> {
private U value;
public GenericClass(U value) {
this.value = value;
}
}
Run Code Online (Sandbox Code Playgroud)
和其他一些类MyClass中的以下泛型方法:
public <T extends BT, BT> void genericMethod(T arg) {
Object genericClass = new GenericClass<BT>(arg);
}
Run Code Online (Sandbox Code Playgroud)
如果我们打电话,BT类型参数将获得哪个值
genericMethod("text");
Run Code Online (Sandbox Code Playgroud)
?
一些说明:
上面的代码编译没有错误或警告,这对我来说似乎很奇怪.反编译(通过IntelliJ IDEA 2016)显示以下代码:
public <T extends BT, BT> void genericMethod(T arg) {
new MyClass.GenericClass(arg);
}
Run Code Online (Sandbox Code Playgroud)
请注意new GenericClass<BT>(arg)并不相同,new GenericClass(arg)因为后者等同于new GenericClass<T>(arg)(类型推导),虽然T extends BT这些是不同的类型,并且GenericClass可能具有内部逻辑,其中确切的类型名称起着重要作用(例如,用作字符串键)一些地图等).所以对我来说奇怪的是,为什么编译器静默使用类型推导而不是产生一些警告(或者甚至是错误),指出没有指定BT类型参数.也许我错过了什么.关于Java中泛型的重要性,但......