下一个代码
public class FilterState<T>{
Map<String, Object> getProperties(){return null;} // null for shorteness
}
....
public test(FilterState filterState){
Map<String, Object> map = filterState.getProperties();
}
产生警告
Unchecked assignment: 'java.util.Map' to 'java.util.Map<java.lang.String, java.lang.Object>
但是,如果我用
替换过程定义public <T> test(IFilterState<T> filterState)
警告消失。我不知道类通用与地图分配有什么关系。通过通用文档快速搜索没有帮助。谁知道在哪里看,有人吗? :)
答案 0 :(得分:5)
如果放弃泛型类型参数,则整个类将被视为使用原始类型,并忽略该类中的所有泛型类型信息。这就是这里发生的事情。
答案 1 :(得分:1)
我记得当你使用原始类型时,reification会失败,因此编译器可以自由地抱怨通用的属性/方法。但我可能错了。
答案 2 :(得分:0)
我不确定问题究竟是什么,但您可能希望查看的一个地方是规范的第4.8节“原始类型”。
原始类型的使用仅允许作为兼容性的让步 遗留代码。在编写后的代码中使用原始类型 将泛型引入Java编程语言是 强烈气馁。 Java的未来版本可能是有可能的 编程语言将禁止使用原始类型。确保;确定 一些人可能会标记可能违反打字规则的行为 访问原始类型的成员将导致编译时 未经检查的警告。
答案 3 :(得分:-1)
根据Class Generics,Type定义的类将是类行为的一部分,所以这里的方法返回类型(Map)Generic有String。我想这就是为什么我们得到这个警告! 由于您在后面添加了部分,这意味着您被迫使用,因此警告不存在......
您可以使用注释@suppresswarning
来禁止警告