如何在java中自动降级类?

How to automatically downcast classes in java?

提问人:KRISTIJAN TOMASINI 提问时间:6/26/2023 更新时间:6/26/2023 访问量:59

问:

您将如何在 Java 中自动下沉?

请看这个例子:

public class Parent {}

public class Boy extends Parent {}

public class Girl extends Parent {}

Parent father = new Boy();
Parent mother = new Girl();

Boy kid = (Boy)father;
Girl kiddette = (Girl)mother;

我知道我可以像上面的例子一样手动向下转换,但是,我将如何自动完成呢?

所以,我想要的是一个自动转换方法,如下所示:

public ? downcast(? parent) { return ? parent; }

我会这样使用:

Boy kid = downcast(father);
Girl kiddette = downcast(mother);

因此,我不想在调用方的方法中执行任何显式强制转换。我需要将铸件隐藏在里面。最好是,我想避免在方法中进行类型检查(),因此,如果可以推广下沉,那就太好了。downcastinstanceofdowncast

我需要放置什么而不是 ,并使其工作。???

我记得大约 10 年前我在 Java 中做了同样的事情,我记得我对代码感到困惑,但它有效,我不明白它是如何工作的,但在过去的 10 年里,我不需要再次在 Java 中做这件事, 所以我忘记了我做了什么。我记得我设法在没有类型检查的情况下解决了它。因此,一行代码适用于parrent class有多少个子类。

Java 泛型 转换

评论

2赞 6/26/2023
没有所谓的“自动”铸造。你在问不可能的事情。如果您认为需要此功能,您应该质疑您的设计。例如,为什么不直接声明Boy father = new Boy();
1赞 Sergii Bishyr 6/26/2023
<P extends Parent> P downcast(Parent p) { return (P) p;
1赞 user16320675 6/27/2023
而不是写,你想要 - 没有太大的收获,实际上是一个额外的方法调用(也许是一个警告)......(Boy)fatherdowncast(father)

答:

2赞 Jorn 6/26/2023 #1

您可以滥用泛型来实现以下目的:

private static <F, T extends F> T cast(F value) {
    return (T) value;
}

现在你可以做

Parent father = new Boy();
Parent mother = new Girl();
Boy kid = cast(father);
Girl kiddette = cast(mother);

这之所以有效,是因为编译器从变量推断目标类型。它也很危险,正如生成的警告所证明的那样:“未检查的强制转换:'F'到'T'”。通常,您不想这样做。您所做的只是将编译器诱骗到通常不允许的强制转换中。kid(T) value

评论

2赞 Rob Spoor 6/26/2023
我正要发布类似的东西。你甚至可以使演员阵容更加不安全:.然后,在调用 时,您可以获得零编译器错误。但是,仍然会有一个.编译器对此发出警告(未经检查的强制转换警告),因此如果您遇到它,这是您自己的错。private static <T> T cast(Object value)Boy boy = cast("I'm a String, not a Boy!")ClassCastException
0赞 kutschkem 6/26/2023
另外,有什么意义?只是避免再次写类名?