作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个以这种方式定义的通用方法:
public <T> T processGeneric(..., Class<T> type){
//do something
}
我希望这个方法尽可能通用,所以任何类型都应该被接受。
只要传递的类型是一个对象,它通常就可以工作,但是泛型类型本身呢?例如:
HashMap<String, String> result;
processGeneric(..., HashMap<String, String>.class); //this does not work
我必须使一切工作的唯一方法是将结果声明为原始类型:
HashMap result;
result = processGeneric(..., HashMap.class); //this works but gives me a warning
但是……这真的是唯一的方法吗?
我正在使用 Java-7。
最佳答案
你可以(而且你应该)避免以这种方式使用原始类型:
HashMap<String, Integer> result;
result = processGeneric(HashMap.class);
但是,您无法避免未经检查的转换(至少在不知道 processGeneric
方法主体的细节的情况下)。唯一的选择是创建自己的类型,它显式绑定(bind) HashMap
类型参数:
public class StringIntegerMap extends HashMap<String, Integer> {}
HashMap<String, Integer> result;
result = processGeneric(StringIntegerMap.class);
如果您没有那么多不同的通用参数,这可能是可以接受的。
总的来说,请记住“原始类型”警告是邪恶的,必须尽可能避免。 “未经检查的转换”警告有时是必要的邪恶,如果您知道自己在做什么就可以了。
关于java - 如何将泛型类型指定为参数,例如 List/Map<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33340161/
我是一名优秀的程序员,十分优秀!