Java 强制转换到父对象更改对象引用?
我正在和jesque、工人和管道一起工作。我同意;问题是我有一个新功能。我有一个名为Java 强制转换到父对象更改对象引用?,java,spring,redis,Java,Spring,Redis,我正在和jesque、工人和管道一起工作。我同意;问题是我有一个新功能。我有一个名为FileAnalysis的类,因此它有一些公共属性,但不够抽象;它仍然非常专注于它的使命 我以前做过另一个特性,并且能够重用这个FileAnalysis。但这一次,我正在处理的功能有了新的关键属性,因此我创建了一个新对象ContactFileAnalysis,其中包含其他属性 FileAnalysis由主对象组成,然后将其解析为JSON并存储在redis中。这是通过一个经理来完成的;此管理器读取/写入redis,
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中的实际对象/引用:它只是应用静态类型的“镜头”。原语上的(“强制转换”是转换,不适用于前面的语句。)谢谢你