Proposal: Generic Specification by Method
Ron Thomas
the.ront at gmail.com
Sun Mar 29 22:15:19 PDT 2009
I would like to propose an extension to generics that would allow a
generic type to be specified by methods in addition to the current
inheritance/implementations.
Generics by Method
AUTHOR(S):
Ron Thomas
OVERVIEW
FEATURE SUMMARY:
Generics by Method allows for the use of Generics when using a common
interface or super class is not an option.
MAJOR ADVANTAGE:
This would allow the use of generics based off of methods instead of
off of classes/interfaces.
MAJOR BENEFIT:
Generics by Method will allow working with different classes with
similar methods easier and more concise. Instead of relying on
instanceof checks and class wrappers a generic type would suffice.
While using Generics by Interface or super class is preferred, it is
not always an option when dealing with 3rd party APIs.
MAJOR DISADVANTAGE:
Reflection will be used in order to achieve this goal, and the
corresponding performance hit will be incurred.
ALTERNATIVES:
Use wrappers and class composition and use generics as-is.
EXAMPLES
SIMPLE EXAMPLE:
The following method calls the close method on a list of resources.
Unfortunately using the Closeable interface is no an option because
one of the resources is supplied by a 3rd party resource does not
implement the interface.
public <T having(close() : void)>
void closeAllResources(List<T> resources) {
for (T t : resources) {
t.close();
}
}
ADVANCED EXAMPLE: Show advanced usage(s) of the feature.
The following example requires two methods, one of which throws an exception.
public <T having(close() : void) having(open(String, int) throws
ResourceException : int)>
boolean checkResources(List<T> resources, String host, int port)
throws ResourceException {
for (T t : resources) {
int status = t.open(host, port);
if (status < 0) {
return false;
}
t.close();
}
return true;
}
DETAILS
SPECIFICATION:
A having generic specification shall be added in the form:
having(METHOD_SIG)
METHOD_SIG := METHOD_NAME([[PARAM_TYPE,]* PARAM_TYPE]*) :
[RETURN_TYPE] [throws [[EXCEPTION,]* EXCEPTION]*
METHOD_NAME := java legal method name
PARAM_TYPE := java legal parameter type
RETURN_TYPE := java legal return type
EXCEPTION := java level exception
The following generic expressions become legal:
Simple specification with no parameters.
<T having(method() : void)>
matches classes with: void method()
Simple specifiation with parameters.
<T having(method(int,String) : int)>
matches classes with: int method(int, String)
Constructor specification
<T having(new(int, String) : int)>
matches classes with constructor that have an int and String parameter
Specification with exception
<T having(method(int, String) throws AException : int)>
matches classes with : int method(int, String) throws AException
OR int method(int, String)
COMPILATION:
The compiler would use reflection to handle calling of the generic
methods themselves.
For example:
public <T having(close() : void)>
void closeAllResources(List<T> resources) {
for (T t : resources) {
t.close();
}
}
Would effectively become:
<T extends Object>
void closeAllResources(List<T> resources) {
for (T t : resources) {
try {
t.getClass().getMethod("close").invoke(t);
} catch (IllegalAccessException ex) {
throw new RuntimeException("Method close not found");
} catch (InvocationTargetException ex) {
throw new RuntimeException("Method close not found");
} catch (NoSuchMethodException ex) {
throw new RuntimeException("Method close not found");
}
}
}
The compiler would also check all uses of this feature, and generate a
compiler error if any usage does not match the criteria given.
TESTING:
The feature can be tested by compiling and running programs that
exercise the feature.
LIBRARY SUPPORT:
No.
REFLECTIVE APIS:
No. The use of this feature is compile time only.
OTHER CHANGES:
No.
MIGRATION:
No. This is a new feature and no existing code should be affected.
COMPATIBILITY
BREAKING CHANGES:
No.
EXISTING PROGRAMS:
This is an addition to generics, and this change would be transparent to them.
REFERENCES
EXISTING BUGS:
More information about the coin-dev
mailing list