尝试仅传递函数中扩展类的父类数据。
public class ParentClass {
String pageNo;
}
public class ExtendClass extends ParentClass {
String lineNo;
}
在另一堂课我想
dosomething(...){
savePage((ParentClass)extendClass);
}
savePage(ParentClass pclass){
.....
}
但是当我查看函数
savePage
参数时,我仍然可以看到不想看到的lineNo
。更新
我已经添加了我面临的问题的调试图片。即使向下转换到
PageApi
,我仍然看到BoardPage class
中存在的“元素”最佳答案
在我看来,您要实现的目标是不可能的。
如果创建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
有什么不同...除非我们在进行类型转换时实际上创建了一个全新的对象?仔细考虑一下,如果显式或隐式类型转换创建了一个新对象,那么您将无法有效地进行多态。从其真实类型或其超类型之一的角度来看,多态性取决于能够对给定对象进行操作。如果创建那个视图实际上创建了一个新对象……它根本就不起作用……除非Java是一种纯函数语言;即没有突变。
简而言之,虽然对于少数用例来说这可能是一个有吸引力的主意,但该主意将从根本上破坏Java作为一种OO语言。
关于java - 试图从扩展类中获取父类(super class),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33837970/