在Java中如何检查一个未经检查的强制类型转换?

4
我有以下问题:我想编写一个使用Java反射的框架。我从某处获得类的名称,并想加载该类并创建一个实例。作为一个附加约束,所有有效的类都属于一个共同的超类。
为了保持简单和易懂,我没有发布我所有的类。相反,我编写了一种类似于"MWE"的东西(见下文)。
我该怎么办? 首先,我定义了一个字符串,模拟要加载的类的名称。在我的应用程序中,我从XML文件中获取名称。 表示类必须是给定类的子类(这里是File,在我的情况下,我有一整个树形结构的单独的类)。 我检查给定的名称是否解析为一个子类。如果是,我应该能够将Class<?>对象强制转换为Class<File>对象。 不幸的是,Eclipse(因此javac)会发出编译警告。
在这种特殊情况下,忽略警告是可以接受的,我可以添加一个注释来抑制警告。好吧。但通常在Java中有更清晰的解决此类问题的方法。我也可以继续使用Class<?>,并在使用对象时稍后转换类型(请参见代码示例)。
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ReflectTest extends File
{
    private static final long serialVersionUID = 8807535438772463115L;
    public ReflectTest()
    {
        super("","");
    }

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalArgumentException, InvocationTargetException, IllegalAccessException
    {
        String className = "ReflectTest";
        Class<?> clsGen = Class.forName(className);
        if(! File.class.isAssignableFrom(clsGen))
        {
            // Throw some error
            System.exit(1);
        }
        Class<File> cls = (Class<File>) clsGen;
        File f1 = cls.getConstructor().newInstance();
        //Constructor<?> constructor = clsGen.getConstructor();
        //File f2 = (File) constructor.newInstance();
    }
}
1个回答

4
您可以使用 Class.asSubclass() 方法:
Class<? extends File> cls = clsGen.asSubclass(File.class);
File f1 = cls.getConstructor().newInstance();

这是编译时安全的,因为如果clsGen不是File的子类,它将抛出ClassCastException

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接