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

标签 java list wildcard

我正在编写一个类,它将对存储在 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 中触发器的机制,每当对列表进行任何修改时,它都会强制我的类清除缓存?

最佳答案

方法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/

相关文章:

python - 如何在 python 中概率填充列表?

java - 修复使用 Java-Streams 进行 reduce() 操作的通配符捕获错误

Apache:使用通配符永久重定向到 HTTPS

java - 如何正确设置 libgdx 中的屏幕

java - 如何读取 .zip 文件的前两个字节以确认是否存在适当的魔数(Magic Number)?

json - 使用本地 json 文件中的数据更新 swift UI 中的列表

mysql - MySQL 多列名称搜索

java - DynamoDB 注释使用混合类型列表反序列化文档 JSON?

java - 推土机映射 JodaTime 属性未按预期工作

java - 如何检查java字符列表除了C或N之外还有其他值