我认为您将自动装箱与类型推断混淆了。
类型推断是编译器可以根据调用方法时使用的变量自行判断它应该在泛型方法上使用什么类型。
例如,如果您有以下方法:
public <T extends SomeClass> T process(T obj) {
// call some methods of SomeClass on obj to process it here
return obj;
}
然后像这样称呼它:
SomeChildClass a = new SomeChildClass(); // SomeChildClass extends SomeClass
a = process(a);
推断的类型将是 SomeChildClass;
可以从参数或返回类型推断类型,如您的示例中所示。但是对于编译器来说,它应该使用什么类型并不总是很明显。this.<Double>getAnything(int flag)
如果发生这种情况,您可以使用您描述的方法强制类型。这通常发生在这样的情况下:
public <T> List<T> getSomeList() {
// implementation
}
public void processList(List<SomeClass> list) {
// implementation
}
并打电话
processList(getSomeList()); // compiler error: cannot convert List<Object> to List<SomeClass>
在这种情况下,您可能需要强制类型参数。
话虽如此,请考虑 polygenelubricants 所说的一切,因为他对您的代码提出了一些非常好的观点并解释了自动装箱是什么(它与原始包装类有关,例如 Integer 代表 int,Double 代表 double)。