繁体   English   中英

如何在Class.class中使用泛型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM