Java中如何在类内部修改当前类自身的实例对象
核心原因
Java中this是指向当前实例的隐式只读引用,不允许被重新赋值,因此直接写this = abcd或者this = tempList会触发variable expected编译错误,你无法在类内部把当前实例对象直接替换成另一个新对象。
对应的编译报错截图如下:
正确实现方案
你需要修改当前实例自身的内部状态,而不是替换实例引用。你原来的去重方法本身还有逻辑错误:遍历的是新建的空列表wordDuplicate,完全没有读取当前实例存储的元素,就算this可以赋值也无法实现去重效果。
正确的实现逻辑是:先提取当前实例的元素完成去重,清空当前实例的原有内容,再把处理完的元素填充回当前实例即可。完整可运行代码如下:
import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashSet; public class AdvancedArrayList<T> extends ArrayList<T> { public void reverse(){ Collections.reverse(this); } public void removeDuplicates(){ // LinkedHashSet去重的同时会保留元素原有顺序 LinkedHashSet<T> distinctElements = new LinkedHashSet<>(this); // 清空当前实例的所有旧元素 this.clear(); // 把去重后的元素添加回当前实例 this.addAll(distinctElements); } }
如果你需要生成一个全新的列表实例,不要尝试在实例方法内修改this,直接定义返回新对象的方法即可:
public static <T> AdvancedArrayList<T> getDistinctInstance(ArrayList<T> source) { AdvancedArrayList<T> newList = new AdvancedArrayList<>(); newList.addAll(new LinkedHashSet<>(source)); return newList; }
内容的提问来源于stack exchange,提问作者Sambhav Khandelwal
相关产品推荐
相关产品推荐

