gpt4 book ai didi

java - 如何检查 java 中的(未检查的)强制转换?

转载 作者:搜寻专家 更新时间:2023-11-01 02:45:28 26 4
gpt4 key购买 nike

我有以下问题:我想编写一个使用 java 反射的框架。我(从某处)得到一个类的名称,我想加载该类并创建一个实例。作为边约束,所有有效的类都属于一个公共(public)父类(super class)。

为了简单起见,我没有发布所有类(class)。相反,我编码了某种“MWE”(见下文)。

我该怎么办?我首先定义一个 String模拟要加载的类的名称。在我的应用程序中,我从 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();
}
}

最佳答案

您可以使用 Class.asSubclass() :

Class<? extends File> cls = clsGen.asSubclass(File.class);
File f1 = cls.getConstructor().newInstance();

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

关于java - 如何检查 java 中的(未检查的)强制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23154694/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com