how to deal with non-generic (legacy) code ?

Philip A. Chapman pchapman@pcsw.us
Tue Aug 4 15:20:00 GMT 2009


You have two options. Either you can use the @SuppressWarnings 
annotation to tell the compiler "yes, I know what I am doing here." or 
you can use the <?> to match any generic type.

@SuppressWarnings("unchecked")
private static Object callMethod(String cname, String mname, String 
funcArg) {
	try {
		Class cls = Class.forName(cname);
		Class argType[] = new Class[1];
		argType[0] = String.class;
		Method meth = cls.getMethod(mname, argType);
		Object retObj = meth.invoke(cls.newInstance(), funcArg);
		return retObj;
	} catch (Exception e) {
		System.err.printf(
				"Error: loading of the specified has failed:\n%s\n", e);
		return null;
	}
}
	
private static Object callMethod(String cname, String mname, String 
funcArg) {
	try {
		Class<?> cls = Class.forName(cname);
		Class<?> argType[] = new Class[1];
		argType[0] = String.class;
		Method meth = cls.getMethod(mname, argType);
		Object retObj = meth.invoke(cls.newInstance(), funcArg);
		return retObj;
	} catch (Exception e) {
		System.err.printf(
				"Error: loading of the specified has failed:\n%s\n", e);
		return null;
	}
}


David Michel wrote:
> Hi All,
> 
> We all know that generics have been introduced in jdk 1.5 and that
> Sun's javac still accepts raw types for backward compatibility.
> 
> With gcj, however, one will always get some warnings like "Vector is a
> raw type. References to generic type Vector<T> should be
> parameterized" when using raw types. It's easy to write the code with
> generics properly so that these warnings do not appear, however, how
> does one deal with, for instance, a method from a somewhat older
> legacy code that returns a raw type.
> 
> Similarly, I'm using the java.lang.reflect package to invoke method
> from its string name and I wrote this:
> 
>     private static Object callMethod(String cname, String mname,
> String funcArg){
>         try {
>             Class cls = Class.forName(cname);
>             Class argType[] = new Class[1];
>             argType[0] = String.class;
>             Method meth = cls.getMethod(mname, argType);
>             Object retObj = meth.invoke(cls.newInstance(),funcArg);
>             return retObj;
>         }
>         catch (Exception e){
>             System.err.printf("Error: loading of the specified has
> failed:\n%s\n",e);
>             return null;
>         }
>     }
> 
> and I get these warnings:
> 
> warning: Class is a raw type. References to generic type Class<T>
> should be parameterized
> 	Class cls = Class.forName(cname);
> 	^^^^^
> ./src/eu/keep/cli/Cli.java:191: warning: Class is a raw type.
> References to generic type Class<T> should be parameterized
> 	Class argType[] = new Class[1];
> 	^^^^^
> ./src/eu/keep/cli/Cli.java:193: warning: Type safety: The method
> getMethod(String, Class...) belongs to the raw type Class. References
> to generic type Class<T> should be parameterized
> 	Method meth = cls.getMethod(mname, argType);
> 
> 
> What is the proper way to deal with this ?
> Is there a way to switch these warnings off ?
> 
> Cheers
> David


-- 
Philip A. Chapman

Desktop, Web Application, and Enterprise Development
Phone: 251-275-6237



More information about the Java mailing list