gpt4 book ai didi

java - 试图从扩展类中获得父类(super class)

转载 作者:行者123 更新时间:2023-11-30 03:09:52 25 4
gpt4 key购买 nike

尝试在函数中仅传递扩展类的父类数据。

public class ParentClass {
String pageNo;
}

public class ExtendClass extends ParentClass {
String lineNo;
}

在另一个类中我正在尝试

dosomething(...){

savePage((ParentClass)extendClass);
}

savePage(ParentClass pclass){
.....
}

但是当我查看函数 savePage 参数时,我仍然可以看到我不想看到的 lineNo

更新

我添加了我遇到的问题的调试图片。即使在向下转换为 PageApi 后,我仍然看到 BoardPage 类 中存在的“元素” enter image description here

最佳答案

在我看来,你想要实现的目标是不可能的。

如果您创建 ExtendClass 的实例,则该实例始终具有 lineNo 字段。

当您显式转换或隐式将 ExtendedClass 类型转换为 ParentClass 时,您不会以任何方式更改实际实例。在运行时,实例在所有情况下都具有 lineNo 字段。现在,编译器不会让 savePage 方法体内的代码查看或引用该字段(除非代码首先将引用强制转换回 ExtendedClass 类型),但该字段仍然会在那里

您正在使用调试器检查实例。调试器不遵循哪些字段应该可见的规则。它看到一切,也向你展示一切。而且,它清楚地向您展示了现实……这个领域确实存在。

那么……有没有办法让磁场完全消失呢?或者对调试器隐藏它?

答案:不,而且不。

<小时/>

(警告:这与原始问题无关,并且可能超出了OP的理解。)

应该有一种方法让磁场消失吗?从语言设计的角度来看?

答案:不会。

将此代码视为“思想实验”:

ExtendedClass ec = new ExtendedClass();
ec.lineNo = 42;
ParentClass pc = (ParentClass) ec; // Actually the cast is redundant
ExtendedClass ec2 = (ExtendedClass) pc;
System.err.println("The old line no is " + ec.lineNo);
System.err.println("The new line no is " + ec2.lineNo);

如果(假设)从 ExtendedClass 转换为 ParentClass 实际上删除了一个字段,那么当您转换回 ExtendedClass 时,字段值将不会不再在那里。但是 ec2.lineNo 实际应该包含什么?它与 ec.lineNo 有何不同...除非我们在进行类型转换时实际上创建了一个全新的对象?

仔细想想,如果显式或隐式类型转换创建了一个新对象,那么您就无法有效地实现多态性。多态性取决于能够从给定对象的真实类型或其父类(super class)型之一的角度对给定对象进行操作。如果创建该 View 实际上创建了一个新对象...它根本不起作用...除非 Java 是一种纯函数式语言;即没有突变。

简而言之,虽然对于少数用例而言,它可能是一个有吸引力的想法,但这个想法将从根本上打破 Java 作为面向对象语言的地位。

关于java - 试图从扩展类中获得父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33837970/

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