编程语言
首页 > 编程语言> > 使用派生类型作为Java中的参数重载方法

使用派生类型作为Java中的参数重载方法

作者:互联网

假设我已经扩展了现有代码,但也避免尽可能地更改代码.

在这个代码的某处,有一个接收某种类型的方法.

Engine.method(Base b) 

现在,我想扩展此功能.所以我将Base扩展为一个名为Derived的类型,它包含了我需要的更多数据,并且我还实现了另一个接收Derived类型并使用它做一些不同的方法.

Engine.method(Derived d)

但我不想将原来的呼叫改为“方法”.我以某种方式设法通过使用标志来实现正确的类型(Base或Derived),但由于原始调用采用Base,因此我的新方法将不会被调用.

Base b = null;
if(flag) {
   b = new Derived()
} else{
   b = new Base()
} 
Engine.method(b) 

问题是现在我的Engine.method(Derived d)不会被调用.我通过使用铸造来解决它

if(flag)
Engine.method((Derived)b) 

但这是错误和愚蠢的.有什么建议?

我总是这样做:

if(flag) {
   Engine.methodForBase(new Base())
} else{
   Engine.methodForDerived(new Derived())
} 

但你能想到更好的东西吗?

谢谢

解决方法:

这是因为Java使用单一调度.这结束意味着在您的情况下,调用的方法取决于引用的类型“b”,它是Base,而不是“b”所包含的实例的类型.因此,将始终调用方法xpto.(Base b).

你真的必须使用你编写的最后一种方法.

标签:java,overloading,extension-methods
来源: https://codeday.me/bug/20190730/1577451.html