提问人:KRISTIJAN TOMASINI 提问时间:6/26/2023 更新时间:6/26/2023 访问量:59
如何在java中自动降级类?
How to automatically downcast classes in java?
问:
您将如何在 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);
因此,我不想在调用方的方法中执行任何显式强制转换。我需要将铸件隐藏在里面。最好是,我想避免在方法中进行类型检查(),因此,如果可以推广下沉,那就太好了。downcast
instanceof
downcast
我需要放置什么而不是 ,并使其工作。?
?
?
我记得大约 10 年前我在 Java 中做了同样的事情,我记得我对代码感到困惑,但它有效,我不明白它是如何工作的,但在过去的 10 年里,我不需要再次在 Java 中做这件事, 所以我忘记了我做了什么。我记得我设法在没有类型检查的情况下解决了它。因此,一行代码适用于parrent class有多少个子类。
答:
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
另外,有什么意义?只是避免再次写类名?
评论
Boy father = new Boy();
(Boy)father
downcast(father)