6

I have a <p:dataTable> where each row has an inputText like this:

<p:dataTable ... rowIndexVar="row">
    <p:column>
        <p:inputText value="#{myBean.items[row + 1]}" />
    </p:column>
</p:dataTable>

The items property is a Map<Long, String>:

private Map<Long, String> items = new HashMap<Long, String>();

When I submit some data and manually iterate over the map, it apparently works:

Iterator itr = items.entrySet().iterator();
while (itr.hasNext()) {
    Map.Entry e = (Map.Entry) itr.next();
    System.out.println("key: " + e.getKey() + " " + "value: " + e.getValue());
}

I get:

key: 1 value: item1
key: 2 value: item2
key: 3 value: item3
key: 4 value: item4

However, when I try to get a specific item by key

String item = items.get(1);

then I get a null. Based on the map's contents I should get item1. How is this caused and how can I solve it?

4

1 回答 1

6

The 1 which you specified in items.get(1) is specified as an int and autoboxed to Integer. This doesn't equals() a Long value of 1 and hence the key is never found.

Integer int1 = new Integer(1);
Long long1 = new Long(1L);
System.out.println(int1.equals(long1)); // false

You need to specify the 1 as Long instead of (implicitly) as Integer.

String item = items.get(1L);

In case you wonders why you didn't got a compilation error here, it's because Map#get() takes an Object instead of K for the reasons mentioned here: What are the reasons why Map.get(Object key) is not (fully) generic.

于 2013-11-12T12:15:56.917 回答