gpt4 book ai didi

java - "Overriding"类中带有通配符的方法

转载 作者:行者123 更新时间:2023-11-30 07:08:55 25 4
gpt4 key购买 nike

我正在编写一个类,它将对存储在 MyObjects 列表中的参数进行耗时的计算。由于我想轻松访问 List 的许多功能,因此我决定将其编写为扩展列表类型(另一种方法是将 List 作为我类中的一个字段并重写我将要使用的所有方法,但看起来过于复杂了)。由于计算非常复杂且耗时,而结果仅取决于存储的参数(没有时间影响,没有隐藏的依赖性等),我决定缓存结果。所以我的代码看起来或多或少是这样的:

public class Calculator extends ArrayList<MyObject> {

private double Result = Double.NaN;

public double getResult() {
if (Double.isNaN(Result)) {
Result = CalculateResult();
}
return Result;
}
}

这样,当第一次调用方法 getResult() 时,它会计算结果,存储它,然后在后续调用中重复使用。

现在,列表的内容可以用多种方法修改,很多修改应该清除缓存。为了实现这一点,通常我会写这样的东西:

public void add(MyObject newvalue) {
super.add(newvalue);
Result = Double.NaN;
}

但是,它不起作用,因为“super”指的是泛型 ArrayList 类,所以编译器会产生类型错误。

在我的水平上,一个明显的技巧是创建一个临时类,它将实现 MyObject 的 ArrayList 并使 Calculator 扩展这个临时类:

public class MyArrayList extends ArrayList<MyObject> {
}

public class Calculator extends MyArrayList {
}

但它看起来又过于复杂了。难道没有更优雅的方法来实现这个结果吗?或者,是否存在类似于 SQL 中触发器的机制,每当对 List 进行任何修改时,它都会强制我的类清除缓存?

最佳答案

add 方法应该返回 boolean 值,所以您需要做的就是

public boolean add(MyObject newvalue) {
boolean retVal = super.add(newvalue);
Result = Double.NaN;
return retVal ;
}

关于java - "Overriding"类中带有通配符的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23708308/

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