Java 强制转换到父对象更改对象引用?

Java 强制转换到父对象更改对象引用?,java,spring,redis,Java,Spring,Redis,我正在和jesque、工人和管道一起工作。我同意;问题是我有一个新功能。我有一个名为FileAnalysis的类,因此它有一些公共属性,但不够抽象;它仍然非常专注于它的使命 我以前做过另一个特性,并且能够重用这个FileAnalysis。但这一次,我正在处理的功能有了新的关键属性,因此我创建了一个新对象ContactFileAnalysis,其中包含其他属性 FileAnalysis由主对象组成,然后将其解析为JSON并存储在redis中。这是通过一个经理来完成的;此管理器读取/写入redis,

我正在和jesque、工人和管道一起工作。我同意;问题是我有一个新功能。我有一个名为
FileAnalysis
的类,因此它有一些公共属性,但不够抽象;它仍然非常专注于它的使命

我以前做过另一个特性,并且能够重用这个
FileAnalysis
。但这一次,我正在处理的功能有了新的关键属性,因此我创建了一个新对象
ContactFileAnalysis
,其中包含其他属性

FileAnalysis
由主对象组成,然后将其解析为JSON并存储在redis中。这是通过一个经理来完成的;此管理器读取/写入redis,并重新创建
FileAnalysis
对象。有一个支持对象来更新管道中文件分析的状态;它叫:

FileAnalysisUpdater(FileAnalysis).
如果我制作了一个能够处理
ContactFileAnalysis
的新管理器,那么该对象将保存新属性,新管理器将正确地将它们存储在redis中。然后在管道中调用更新程序。我想要实现的是调用

ContactFileAnalysis contactFileAnalysis;
updater.Update((FileAnalysis) contactFileAnalysis);
当我强制转换到父对象并完成管道时,
contactFileAnalysis
会被更新程序更新吗?或者此强制转换是否会更改对象引用,因此不会反映任何更改

我想重用这个功能,因为它没有变化;行为是一样的,信息是一样的;我只需要传播新的信息,为了做到这一点,我将其保存在redis中,但从那时起,它是一样的;更新程序不需要我的新对象中的任何内容


注意:我知道重新编写每个涉及的对象并确保它与新的FileAnalysis一起工作会更安全,但这意味着对于一个很少使用且不那么重要的特性需要大量代码。另外,我为这个项目工作,要批准4k行代码的PR并不容易。

正如用户2864740在评论中指出的那样,强制转换对象引用不会改变引用。您可以很容易地测试这一点:

Object obj = null;
String str = "foo";
obj = (Object) str; // Unnecessary! See below.
System.out.println ("Is str == obj? " + (str == obj));
但是,向父对象强制转换可能是不必要的。希望您将
ContactFileAnalysis
声明为
FileAnalysis
的子类:

public class ContactFileAnalysis extends FileAnalysis
如果是这样,那么对
ContactFileAnalysis
实例的任何引用始终被视为对
FileAnalysis
实例的引用。实际上,它也是对
FileAnalysis
”超类实例的引用,依此类推(指向所有java对象的父对象
java.lang.Object
)。这意味着在示例代码中对
对象的强制转换是不必要的:

obj = str; // This works, and is considered proper style.
也没有必要强制转换它以将其传递给
updater.Update()
。(另一个样式说明:方法应以小写字母开头。)

请注意,如果您没有将
ContactFileAnalysis
声明为
FileAnalysis
的子类,则必须强制转换它。(如果您有一个实现了两个接口的类,将对该类实例的引用键入其中一个接口,并希望将其传递给获取另一个接口实例的方法,则可能会发生这种情况。)

另一个注意事项:如果出于某种原因,您有以下两种方法:

public void update (FileAnalysis fa) { /* code */ }
public void update (ContactFileAnalysis cfa) { /* ugh */ }
您引用了一个
ContactFileAnalysis
实例,并将其传递给您的更新程序:

ContactFileAnalysis myCFA = new ContactFileAnalysis();
updater.update (myCFA);
它将使用第二个
更新
——定义为获取CFA的更新。然而,你可以说:

updater.update ((FileAnalysis) myCFA);
它将使用第一个
更新
。如果将
FileAnalysis
变量设置为它,也会发生同样的情况

FileAnalysis myFA = myCFA;
updater.update (myFA); // uses the first update, even though it's a CFA

希望你能理解为什么。如果没有,请查看。

,正如用户2864740在评论中指出的,强制转换对象引用不会更改引用。您可以很容易地测试这一点:

Object obj = null;
String str = "foo";
obj = (Object) str; // Unnecessary! See below.
System.out.println ("Is str == obj? " + (str == obj));
但是,向父对象强制转换可能是不必要的。希望您将
ContactFileAnalysis
声明为
FileAnalysis
的子类:

public class ContactFileAnalysis extends FileAnalysis
如果是这样,那么对
ContactFileAnalysis
实例的任何引用始终被视为对
FileAnalysis
实例的引用。实际上,它也是对
FileAnalysis
”超类实例的引用,依此类推(指向所有java对象的父对象
java.lang.Object
)。这意味着在示例代码中对
对象的强制转换是不必要的:

obj = str; // This works, and is considered proper style.
也没有必要强制转换它以将其传递给
updater.Update()
。(另一个样式说明:方法应以小写字母开头。)

请注意,如果您没有将
ContactFileAnalysis
声明为
FileAnalysis
的子类,则必须强制转换它。(如果您有一个实现了两个接口的类,将对该类实例的引用键入其中一个接口,并希望将其传递给获取另一个接口实例的方法,则可能会发生这种情况。)

另一个注意事项:如果出于某种原因,您有以下两种方法:

public void update (FileAnalysis fa) { /* code */ }
public void update (ContactFileAnalysis cfa) { /* ugh */ }
您引用了一个
ContactFileAnalysis
实例,并将其传递给您的更新程序:

ContactFileAnalysis myCFA = new ContactFileAnalysis();
updater.update (myCFA);
它将使用第二个
更新
——定义为获取CFA的更新。然而,你可以说:

updater.update ((FileAnalysis) myCFA);
它将使用第一个
更新
。如果将
FileAnalysis
变量设置为它,也会发生同样的情况

FileAnalysis myFA = myCFA;
updater.update (myFA); // uses the first update, even though it's a CFA

希望你能理解为什么。如果没有,请查看。

强制转换不会改变Java中的实际对象/引用:它只是应用静态键入的“镜头”。(“对原语的强制转换”是转换,不适用于前面的语句。)感谢您的评论,是否有指向文档的链接,我可以在其中阅读更多内容?我几乎完成了我的代码并准备对其进行测试,但我想了解更多关于这一点的信息。强制转换不会改变Java中的实际对象/引用:它只是应用静态类型的“镜头”。原语上的(“强制转换”是转换,不适用于前面的语句。)谢谢你