gpt4 book ai didi

java - 使用对象的运行时类实例化泛型类

转载 作者:行者123 更新时间:2023-12-01 12:51:34 26 4
gpt4 key购买 nike

我有这个通用类:

public class MyClass<T> {

public void myMethod(T arg) {
// ...
}
}

如何获取此类的实例,该实例使用对象的类作为泛型类型 T

也就是说,如果我有:

SomeClass o = new SomeClass()

如何获取 MyClass<SomeClass> 的实例通过获取 o 的运行时类?

基本上我需要的是这样的东西(我知道这没有意义......这只是为了提供一个想法):

MyClass<o.getClass()> m = new MyClass<o.getClass()>()

这可能吗?如果没有,我可以实现拥有 MyClass 实例的目标吗?它有一个方法,该方法采用与 o 运行时类型相同类型的参数。 ? (是的,它必须是那个确切的类型,不能是父类(super class)......)

这里可以选择反射!

谢谢!

最佳答案

由于运行时类型删除,MyClass<X> 创建的运行时对象和MyClass<Y>将是相同的。事实是new MyClass<X>().myMethod()可以通过 X 调用但不在Y上是一个编译时事实,而不是运行时事实。编译时问题是“可以在这个变量上调用它吗?”,而不是“可以在具有相同结果 getClass() 的对象上调用它吗?”。 p>

您可以创建工厂方法来根据 Class 的编译时类型创建类的通用实例。对象,或您希望使用它的实际对象:

public class MyClass<T> {
// ...

public static <T> MyClass<T> forClass(Class<T> c) {
return new MyClass<T>();
}

public static <T> MyClass<T> forObject(T object) {
return new MyClass<T>();
}
}

如果您希望泛型类的方法实际上具有运行时类型检查,那也是可能的。只需存储一个 Class MyClass 中类型的对象实例,并使用其 isInstance()cast()方法来检查方法的参数类型。您必须手动执行此操作,因为这不是通常对普通泛型类执行的操作,因为它通常是不必要的。

关于java - 使用对象的运行时类实例化泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24188657/

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