How can I use Java's generic types?
Using metadata, Ice applications can customize the Java mapping for Slice sequences and dictionaries.
On this page:
Customizing the Java Mapping for Sequences
The default mapping for a Slice sequence is a native Java array. If an alternative mapping is specified, the type must implement java.util.List<E>
, where E
is the Java mapping of the element type. For example, here is how we can map a sequence of integers to a linked list:
["java:type:java.util.LinkedList<Integer>"] sequence<int> IntList; interface I { IntList getList(); }
When translated by the Slice-to-Java compiler, all occurrences of the IntList
type will use java.util.List<Integer>
instead of an int
array:
IPrx proxy = ... java.util.List<Integer> list = proxy.getList(); for(int val : list) { System.out.println("entry: " + val); }
Whenever the generated code must instantiate IntList
, it now allocates an instance of java.util.LinkedList<Integer>
.
Customizing the Java Mapping for Dictionaries
The default mapping for a Slice dictionary is java.util.Map<K, V>
and implemented as java.util.HashMap<K, V>
, where K
is the Java mapping for the key type and V
is the Java mapping for the value type. If an alternative mapping is specified, the type must implement the java.util.Map<K, V>
interface. As an example, the following Slice definition changes the default mapping for a dictionary to use a tree map:
["java:type:java.util.TreeMap<String, Integer>"] dictionary<string, int> StringMap; interface I { StringMap getMap(); }
We can iterate over the map as shown below:
IPrx proxy = ... java.util.Map<String, Integer> map = proxy.getMap(); for(String key : map.keySet()) { int val = map.get(key); System.out.println(key + " = " + val); }