gpt4 book ai didi

java - 如何在不进行强制转换的情况下重写时指定方法参数?

转载 作者:行者123 更新时间:2023-12-05 04:11:38 24 4
gpt4 key购买 nike

我有一个关于方法覆盖的问题,它可能受到其他一些方面的影响,所以我希望这个问题足够具体。上下文:我尝试为某些对象的价格构建一个简单的计算器,但“价格种类”应与其余逻辑分离,以便客户端只需要知道以下接口(interface)。

我认为最好用我的问题开始的基本代码来解释。

public interface InterfacePrice {
public InterfacePrice addPrices(InterfacePrice price1, InterfacePrice price2);
public InterfacePrice subtractPrices(InterfacePrice price1, InterfacePrice price2);
public String priceToString();
}

所以这就是我应该能够用两个价格做的事情。现在我试着详细说明一下:

public class BnSPrice implements InterfacePrice {
int gold = 0;
int silver = 0;
int copper = 0;
//the following will obviously not compile but i hope it helps explain
@Override
public InterfacePrice addPrices(BnSPrice price1, BnSPrice price2) {
return null;
[...more code here...]
}

所以我想做的是基于 100 铜等于 1 银等事实编写一个简单的加法。现在我的问题:编译器不允许我将参数更改为我理解的 BnSPrice 类型,我只是想说明问题。如果我不知道它们具有正确的类型,那么尝试添加两个具体价格的一些黄金和白银是没有意义的,所以我想到的第一件事是获得正确的行为是用普通的 InterfacePrice 覆盖方法参数并在方法开始时进行类型检查并转换为合适的类型,但这似乎不是很有效或美观。

问题:当我的客户端代码只需要知道接口(interface)时,我如何更改设计以获得以后添加其他价格模型的灵 active ?(我只是在学习 java,所以如果这个问题有一些我看不到的明显答案,请原谅我。)它可以通过使用泛型来解决吗? (我不太了解那些……我正在努力让泛型的用法进入我的脑海。)

在此先感谢您的帮助。

最佳答案

如果你想在派生类中应用,对父方法的参数进行一些限制,泛型可以帮助你。

使用泛型,您还可以选择在方法中返回参数化类型或 InterfacePrice

在您的具体类示例中,您编写:

@Override
public InterfacePrice addPrices(BnSPrice price1, BnSPrice price2) {

我将为 addPrices() 方法和 subtractPrices() 方法给出一个遵循这种方式的示例,我将使用我们想要返回特定类型的方式。

您可以创建一个通用接口(interface):

public interface InterfacePrice<T extends InterfacePrice<T>> {
public InterfacePrice<T> addPrices(T price1, T price2);
public T subtractPrices(T price1, T price2);
public String priceToString();
}

这是它的一个实现:

public class BnSPrice implements InterfacePrice<BnSPrice> {
int gold = 0;
int silver = 0;
int copper = 0;

@Override
public InterfacePrice<?> addPrices(BnSPrice price1, BnSPrice price2) {
return ...;
}

@Override
public BnSPrice subtractPrices(BnSPrice price1, BnSPrice price2) {
return ...;
}

@Override
public String priceToString() {
return ...;
}
}

关于java - 如何在不进行强制转换的情况下重写时指定方法参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42375599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com