在 Java 中,如何转换类引用(如果可能)?

In Java, how does one cast Class references (if possible)?

提问人:Shane Gillis 提问时间:3/16/2023 更新时间:3/16/2023 访问量:67

问:

让我设置问题:

我正在使用一个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

现在,我宁愿认为我做演员的方式是不正确的,但我想知道如果可能的话,做这种演员阵容是否正确?

Java 反射 转换

评论

0赞 3/16/2023
不确定我是否做对了,但您的 cast 类对象到 actul 对象,所以它应该是thisType = (Class<FavoriteCousin>) typeObject;
4赞 Bastien Aracil 3/16/2023
正如@justsomeone所说,演员阵容是错误的。只是想补充一些方法可以做到这一点(实际上与简单的投射相同):tthisType = typeObject.asSubclass(FavoriteCousin.class)

答:

0赞 Andrés Alcarraz 3/16/2023 #1

简短的回答,不。

假设您正在尝试强制转换为 。typeObjectClass<FavoriteCousin>

发生的情况是:如果类是它的子类,则不会使 成为 的子类。在这一点上它不会失败,因为运行时中的强制转换不关心泛型参数,但是如果您假设获得的参数实际上是一个类,其实例可以分配给 类型的变量,则以后会遇到麻烦。ABClass<A>Class<B>thisTypeFavoriteCousin

您可能想做的是这样的:

public void doSomething(Class<? extends GreatGrandParentClass> typeObject)
{
    Class thisType;
    if (FavoriteCousin.class.isAssignableFrom(typeObject))
        thisType = FavoriteCousin.class;
    ...
}

所以我想知道你为什么要首先做演员。

评论

0赞 Shane Gillis 3/17/2023
这实际上是我所做的,但我想它看起来很笨拙。所以我确保没有更好的方法来做到这一点(如果你愿意的话,可以进行健全性检查)。我仍然习惯于大量使用类引用和反射,而且我一个人在做这件事。所以我真的很感谢你们给我的理智检查。