【发布时间】:2018-01-11 08:03:20
【问题描述】:
在处理配置管理器对象时,我想实现一种方法,该方法可以从管理器的内部索引中检索值并将其自动转换为所需的类型,从而无需显式转换。我认为这很容易,使用 Java 在方法头中提供的泛型系统。所以,我这样构建我的方法:
public <T> T getSettingAutocast(String key)
{
T retV = null;
try {retV = (T) getSetting(key);}catch (ClassCastException ignored){}
return retV;
}
我通过使用它从设置注册表中提取文件来测试该方法,如下所示:
File f = configIO.getSettingAutocast("file");
注册表已在该键地址处预加载了 File 对象。
这按预期工作。但是,如果我将File 换成Integer,事情就不那么顺利了——我得到了ClassCastException。在调试模式下查看它,T 是方法开始时的正确类型,但是当调用强制转换时,它只是变形为 getSetting 返回的任何类型。
我的印象是编译器试图从目标对象(在本例中为File 或Integer)推断<T>,而不是方法体本身中的任何类型。如果有人能提供更多关于编译器在方法方面如何处理类型推断的见解,将不胜感激。
【问题讨论】:
标签: java generics casting type-inference