[英]How to use generic in Class.class
我想避免警告:
“类型安全类型的表达式需要未经检查的转换才能符合Class”
从这句话:
Class<MyInterface> cc = interpreter.get("Myclass", Class.class );
我努力了:
Class<MyInterface> cc = interpreter.get("Myclass", Class<MyInterface>.class );
但是是无效的。
没有@SuppressWarnings(“ unchecked”)怎么办?
interpreter.get的签名:
T interpreter.get(String name, Class<T> javaClass)
上下文:我使用Jython库,并在Python中定义一个实现MyInterface的类,然后在Java中捕获该类,然后创建它们的实例。 这就是为什么我需要类本身,而不是类的实例。
代码类似于:
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("from cl.doman.python import MyInterface");
....
interpreter.exec(pythonCode);
Class<MyInterface> cc = interpreter.get("Myclass", Class.class);
MyInterface a = (MyInterface) cc.newInstance();
我的代码工作正常,但我无法抑制警告。
大概
Class<?> clazz = interpreter.get("Myclass", Class.class);
Class<? extends MyInterface> cc = clazz.asSubclass(MyInterface.class);
// look, Ma, no typecast!
MyInterface a = cc.newInstance();
更新给定问题的新上下文(使用PythonInterpreter),我回答的内容将用于通用T get(String name, Class<T> javaClass)
而不是与PythonInterpreter一起使用。
我写了一个小例子,以及一个简单的“解释器”类,该类为每个例子定义了一个简单的方法。 给定您的示例get方法。 我希望它返回T
而不是Class<T>
。
下面的示例还使我想起了一个(非常简单的)Spring Bean加载示例,您可以在其中加载具体的实现并返回接口。
public class Test {
public static void main(String[] args) {
final Interperter<MyInterface> interperter = new Interperter<MyInterface>() ;
final MyInterface i = interperter.get("MyClass", MyInterface.class);
System.out.println(i);
}
public static class Interperter<T> {
// A sample get method with the same signature, The body's contents shouldn't matter to much for this demonstration.
public T get(String name, Class<T> javaClass) {
try {
final Class<?> clazz = ClassLoader.getSystemClassLoader().loadClass(name);
return (T) clazz.newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
}
}
样例界面
public interface MyInterface {}
示例基础类
public final class MyClass implements MyInterface {
@Override
public String toString() {
return "MyClass{}";
}
}
程序输出: MyClass{}
如果您感到我误解了您的问题,请告诉我:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.