Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有多个有界类型和未选中强制类型转换的Class.asSubclass_Java_Generics_Casting - Fatal编程技术网

Java 具有多个有界类型和未选中强制类型转换的Class.asSubclass

Java 具有多个有界类型和未选中强制类型转换的Class.asSubclass,java,generics,casting,Java,Generics,Casting,我有一个类,它的类型是。我有一个成员变量Class bar,我通过类名设置它:t=(Class)Class.forName(name)。这给了我一个未经检查的施法警告 通常情况下,可以在类似的情况下使用,但由于T有多个边界,因此我无法在没有编译器警告的情况下使用它: //This is type safe, but I still get an unchecked cast warning t = (Class<T>) Class.forName(className).asSubcl

我有一个类,它的类型是
。我有一个成员变量
Class bar
,我通过类名设置它:
t=(Class)Class.forName(name)
。这给了我一个未经检查的施法警告

通常情况下,可以在类似的情况下使用,但由于
T
有多个边界,因此我无法在没有编译器警告的情况下使用它:

//This is type safe, but I still get an unchecked cast warning
t = (Class<T>) Class.forName(className).asSubclass(Enum.class).asSubclass(Runnable.class);

我相信你不能。。。我认为最好的解决方案是将
类clazz
直接作为参数传递,而不是它的
字符串名

//This is type safe, but I still get an unchecked cast warning
t = (Class<T>) Class.forName(className).asSubclass(Enum.class).asSubclass(Runnable.class);
这样就可以了,但显然不是类型安全的:

Example<T1> example = new Example<T1>("foo.T2");
Class<T1> t1Clazz = example.t; //uh oh...

这是因为,如果没有type参数,很少有情况下您可以真正利用它同时是
enum
Runnable
的知识。如果创建类的实例,则需要将其分配给类型为
Runnable
Enum
的变量/字段;你不能两者兼得。

这并不总是可能的。如果该类是命令行参数,该怎么办?
package foo;
public enum T1 implements Runnable {
    ;
    @Override
    public void run() {
    }
}

package foo;
public enum T2 implements Runnable {
    ;
    @Override
    public void run() {
    }
}
Example<T1> example = new Example<T1>("foo.T2");
Class<T1> t1Clazz = example.t; //uh oh...
Class<? extends Runnable> runnableClass;
Class<? extends Enum> enumClass;

Example(String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
    Class<?> clazz = Class.forName(className);
    runnableClass = clazz.asSubclass(Runnable.class);
    enumClass = clazz.asSubclass(Enum.class);
}