Java参数类型错误

时间:2016-06-16 04:03:38

标签: java generics

IDE抱怨:“错误的第二个参数类型:找到布尔值,必需:?”

public void onItemClick(View view, int positon) {
    HashMap<String, ?> movie = (HashMap<String, ?>) movieData.getItem(positon);

    if(view.getId() == R.id.checkBox) {
        boolean selection = (boolean) movie.get("selection") ? false : true;

        // Error here
        movie.put("selection", selection);
    }
}

然而,这个会起作用

public void onItemClick(View view, int positon) {
    HashMap movie = movieData.getItem(positon);

    if(view.getId() == R.id.checkBox) {
        boolean selection = (boolean) movie.get("selection") ? false : true;

        movie.put("selection", selection);
    }
}

3 个答案:

答案 0 :(得分:2)

Unbounded Wildcards的Java教程页面中,它声明:

  

值得注意的是,List<Object>List<?>并不相同。您可以在Object中插入ObjectList<Object>的任何子类型。但您只能将null插入List<?>Guidelines for Wildcard Use部分提供了有关如何确定在给定情况下应使用哪种通配符(如果有)的更多信息。

您应该考虑在这里使用通配符的原因。如果可能,请不要使用通配符。如果您仍然需要使用一个,请使用适当的Upper Bounded Wildcard以便知道该类型。

由于您在其他数据类型中存储了Boolean,因此唯一的共同父级是Object

HashMap<String, Object> movie;

答案 1 :(得分:0)

将该行替换为:

HashMap<String, Boolean> movie = (HashMap<String, Boolean>)

在泛型中,如果你使用&#39;?&#39;通配符,它​​的类型称为未知类型,这意味着您不能将布尔值设置为未知类型。希望它对你有用。

对于泛型中的通配符,这里非常好link,我建议你阅读一次。

答案 2 :(得分:0)

generic不接受原始类型。它接受Only Object.so你应该使用Map<String,Boolean> mp = new HashMap<String,Boolean>();