提问人:Shane Gillis 提问时间:3/16/2023 更新时间:3/16/2023 访问量:67
在 Java 中,如何转换类引用(如果可能)?
In Java, how does one cast Class references (if possible)?
问:
让我设置问题:
我正在使用一个API,大量的继承正在进行中。传递和使用类类型对象(例如 String.class 而不是 String 的实例)非常有用。在使用 Class 对象时,对它们进行范围检查也很有用,因此方法可能具有如下参数:
public void doSomething(Class<? extends GreatGrandParentClass> typeObject)
{ ... }
问题是 GreatGrandParentClass 有很多孩子、孙子和曾孙。因此,有时作为参数传递的类型对象,或在集合中传递的类型对象,或者其他类型,是 GreatGrandParentClass 的后代,但我想在确认它属于该类型后将 typeObject 转换为其实际类型。例如:
public void doSomething(Class<? extends GreatGrandParentClass> typeObject)
{
Class thisType;
if (FavoriteCousin.class.isAssignableFrom(typeObject))
thisType = (FavoriteCousin) typeObject;
...
}
然后,我使用 thisType 作为方法的参数,该方法需要 FavoriteCousin 类型的 Class 对象:
public void needsCousin(Class<? extends FavoriteCousin> cousinType)
{ ... }
但是,如果我尝试像上面那样投射,我会得到:
Incompatible types: Class<CAP#1> cannot be converted to FavoriteCousin where CAP#1 is a fresh-type variable: CAP#1 extends GreatGrandParentClass from capture of ? extends GreatGrandParentClass
现在,我宁愿认为我做演员的方式是不正确的,但我想知道如果可能的话,做这种演员阵容是否正确?
答:
0赞
Andrés Alcarraz
3/16/2023
#1
简短的回答,不。
假设您正在尝试强制转换为 。typeObject
Class<FavoriteCousin>
发生的情况是:如果类是它的子类,则不会使 成为 的子类。在这一点上它不会失败,因为运行时中的强制转换不关心泛型参数,但是如果您假设获得的参数实际上是一个类,其实例可以分配给 类型的变量,则以后会遇到麻烦。A
B
Class<A>
Class<B>
thisType
FavoriteCousin
您可能想做的是这样的:
public void doSomething(Class<? extends GreatGrandParentClass> typeObject)
{
Class thisType;
if (FavoriteCousin.class.isAssignableFrom(typeObject))
thisType = FavoriteCousin.class;
...
}
所以我想知道你为什么要首先做演员。
评论
0赞
Shane Gillis
3/17/2023
这实际上是我所做的,但我想它看起来很笨拙。所以我确保没有更好的方法来做到这一点(如果你愿意的话,可以进行健全性检查)。我仍然习惯于大量使用类引用和反射,而且我一个人在做这件事。所以我真的很感谢你们给我的理智检查。
评论
thisType = (Class<FavoriteCousin>) typeObject;
tthisType = typeObject.asSubclass(FavoriteCousin.class)