gpt4 book ai didi

java - 如何在运行时将 Class 转换为类似于 Class 的对象?

转载 作者:搜寻专家 更新时间:2023-11-01 00:54:39 27 4
gpt4 key购买 nike

我有一个如下所示的类:

class FooClassAnalyser<T extends Foo> extends ClassAnalyser<T>

(其中 ClassAnalyser 是许多具体实现的抽象基类;FooClassAnalyser 是专门用于 T 扩展 Foo 的具体实现)。它有一个看起来像这样的构造函数:

FooClassAnalyser(Class<T> classToAnalyse)

在另一个类中,我有一个 ClassAnalyser 的静态工厂方法根据 classToAnalyse 的类型调用适当的构造函数的 s :

static <U> ClassAnalyser<U> constructClassAnalyser(Class<U> classToAnalyse)

我想要的功能是检查是否U instanceof Foo , 然后构造一个 FooClassAnalyser如果是,则返回。

但是,我找不到在 Java 的类型系统中适应它的方法。类型删除意味着我们不能对 U 做任何巧妙的事情。直接地。然而,事实上我们通过了classToAnalyse in 作为参数可以测试是否 U instanceof Foo通过使用反射:

if (Foo.class.isAssignableFrom(classToAnalyse))

我的问题是不像instanceof ,这个“通过反射的实例”对于 Java 的类型系统是不可见的。特别是传递 classToAnalyse直接作为 FooClassAnalyser 的参数的构造函数因类型不匹配而失败,因为 Java 不知道 classToAnalyse实际上是一个 Class<U extends Foo> .

到目前为止,我找到的最佳解决方案是使用未经检查的转换来制作 classToAnalyse一个Class<? extends Foo> (它被实际上检查了,但是 Java 不知道它被检查了)。这至少可以将其作为参数传递给 new FooClassAnalyser , 并得到一个 FooClassAnalyser<?>作为返回的对象。然而,问题是这不会再转换回 ClassAnalyser<U>。 ,因为 Java 无法识别转换 classToAnalyse尽管如此,拥有不同的通用绑定(bind)并不会改变 Class 的事实object 仍然是同一个对象(因此仍然是 Class<U> );换句话说,Java 只能看到一个 FooClassAnalyser<?>。它无法识别的也是一个 FooClassAnalyser<U> ,因此转换回来需要另一个未经检查的转换。结果是编译和运行的代码,但有许多关于类型安全的警告。

我尝试过的大多数其他事情都是语法错误(例如 Class<U extends Foo> 类型的变量不能直接声明;Java 不能正确解析它)。应该注意的是,我实际上没有 U 类型的对象。在任何时候;我正在尝试分析类本身,因此只有 Class<U>要处理的对象。

是否有可能以类型安全的方式编写这样的代码?

最佳答案

My problem is that unlike instanceof, this "instanceof via reflection" isn't visible to Java's type system. In particular, passing classToAnalyse directly as an argument to FooClassAnalyser's constructor fails with a type mismatch because Java doesn't know that classToAnalyse is actually a Class<U extends Foo>.

只要您传递 Class<U> 就会发生这种情况至 constructClassAnalyser .你没有给我们提供太多代码,所以我不能为你写一个明确的解决方案;然而,如果你能找到一种方法来传递U,事情就会简单得多。至 constructClassAnalyser而不是 Class<U> .

static <U> ClassAnalyser<U> constructClassAnalyser(U objectToAnalyse)

要检查它的类,您可以使用 objectToAnalyse#getClass ;你也可以使用 instanceof验证 U extends Foo如果objectToAnalyse instanceof Foo返回 true ,然后根据需要将其转换为各自的类。

关于java - 如何在运行时将 Class<T> 转换为类似于 Class<T extends Foo> 的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44489901/

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