Title
[Generics] Support optional type parametersIntroduction
In majority of use cases, the data type retrieved from a Map object is the same type of the data that was added to it. But there are exceptions, for example, the MultiMap and TransformedMap in the wildly adopted Jakarta Commons-Collections. With the current definition of the java.util.Map interface, it is impossible to parameterized the MulitMap while still maintain the backward compatibility with legacy code. Refining the java.util.Map as Map<K,V,I> can resolve the problem but then all existing parameterized subclass of Map must be changed.Justification
It is a very common situation in the evolution of any application or code library that a new typed parameter needs to be added to an existing interface or class. This task becomes extermely difficult (if not at all impossible) with the limitation of current generics syntax. As we all familiar with adding overloaded methods to extend the functionality of an object, a similar mechanism in Generics is very much yearned. The description section above provided a example and there is a blog explains it in detail: http://kennethxu.blogspot.com/2006/06/is-definition-of-map-interface-overly.htmlExpected Behavior
A default type can be assiged to a typed parameter. Examples:class Foo<K,V=Object> {...} // means Object is used when V is omitted
Foo<String> foo; // equivalent to Foo<string,> foo;
Foo<String> foo; // equivalent to Foo<string,> foo;
interface Bar<K,V=K> {...} // means type K is used when V is ommited
Bar<String> bar; // equivalent to Bar<String,String> bar;
Bar<String> bar; // equivalent to Bar<String,String> bar;
Test Code
A very simple test case:public class GenericsEnhancement {
class Foo<K,V=Object> {} // means Object is used when V is omitted
class Bar<K,V=K> {} // means type K is used when V is ommited
public void test() {
Foo<String> foo1 = new Foo<String,Object>();
Foo<String,Object> foo2 = new Foo<String>();
Bar<String> bar1 = new Bar<String,String>();
Bar<String,String> bar2 = new Bar<String>();
}
}
class Foo<K,V=Object> {} // means Object is used when V is omitted
class Bar<K,V=K> {} // means type K is used when V is ommited
public void test() {
Foo<String> foo1 = new Foo<String,Object>();
Foo<String,Object> foo2 = new Foo<String>();
Bar<String> bar1 = new Bar<String,String>();
Bar<String,String> bar2 = new Bar<String>();
}
}
No comments:
Post a Comment