普通类的方法调用

时间:2012-07-06 12:38:51

标签: java generics methods

下一个代码

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)

警告消失。我不知道类通用与地图分配有什么关系。通过通用文档快速搜索没有帮助。谁知道在哪里看,有人吗? :)

4 个答案:

答案 0 :(得分:5)

如果放弃泛型类型参数,则整个类将被视为使用原始类型,并忽略该类中的所有泛型类型信息。这就是这里发生的事情。

答案 1 :(得分:1)

我记得当你使用原始类型时,reification会失败,因此编译器可以自由地抱怨通用的属性/方法。但我可能错了。

答案 2 :(得分:0)

我不确定问题究竟是什么,但您可能希望查看的一个地方是规范的第4.8节“原始类型”。

  

原始类型的使用仅允许作为兼容性的让步   遗留代码。在编写后的代码中使用原始类型   将泛型引入Java编程语言是   强烈气馁。 Java的未来版本可能是有可能的   编程语言将禁止使用原始类型。确保;确定   一些人可能会标记可能违反打字规则的行为   访问原始类型的成员将导致编译时   未经检查的警告。

答案 3 :(得分:-1)

根据Class Generics,T​​ype定义的类将是类行为的一部分,所以这里的方法返回类型(Map)Generic有String。我想这就是为什么我们得到这个警告! 由于您在后面添加了部分,这意味着您被迫使用,因此警告不存在......

您可以使用注释@suppresswarning

来禁止警告