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

public class ParentClass {
 String pageNo;
}

public class ExtendClass extends ParentClass {
 String lineNo;
}


在另一堂课我想

dosomething(...){

 savePage((ParentClass)extendClass);
}

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


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

更新

我已经添加了我面临的问题的调试图片。即使向下转换到PageApi,我仍然看到BoardPage class中存在的“元素”
java - 试图从扩展类中获取父类(super class)-LMLPHP

最佳答案

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

如果创建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/

10-10 14:26