You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义扩展ArrayList内部调用元素的getId方法(无需抽象类)

解决方案

首先修正你的泛型声明,避免使用原始类型(raw type),将extends ArrayList改为extends ArrayList<E>,这样get()方法会返回泛型类型E而非Object。接下来在不修改A、B类的前提下,有两种可行方案:

方案1:使用函数式接口提取ID(Java 8+ 推荐)

通过给ArrayListId添加一个函数式接口成员,用来定义从泛型元素中提取ID的逻辑,创建实例时传入对应类型的方法引用即可:

import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Function;
import androidx.annotation.NonNull;

public class ArrayListId<E> extends ArrayList<E> {
    private final Function<E, String> idExtractor;

    // 构造方法接收集合和ID提取器
    public ArrayListId(@NonNull Collection<? extends E> c, Function<E, String> idExtractor) {
        super(c);
        this.idExtractor = idExtractor;
    }

    public void doSomething() {
        if (isEmpty()) {
            return; // 避免空列表索引越界
        }
        // 通过提取器获取ID
        String id = idExtractor.apply(get(0));
        // 后续业务逻辑
    }
}

使用示例:

// 针对A类创建实例,传入A::getId作为提取器
ArrayListId<A> listA = new ArrayListId<>(aCollection, A::getId);
listA.doSomething();

// 针对B类创建实例,传入B::getId作为提取器
ArrayListId<B> listB = new ArrayListId<>(bCollection, B::getId);
listB.doSomething();

方案2:强制类型转换(不推荐,仅作兼容参考)

如果无法使用Java 8+的函数式特性,可以在doSomething中对元素进行强制类型转换,但这种方式需要确保列表中的元素类型正确,否则会抛出ClassCastException:

import java.util.ArrayList;
import java.util.Collection;
import androidx.annotation.NonNull;

public class ArrayListId<E> extends ArrayList<E> {
    public ArrayListId(@NonNull Collection<? extends E> c) {
        super(c);
    }

    public void doSomething() {
        if (isEmpty()) {
            return;
        }
        // 强制转换为对应类型,需保证列表元素类型正确
        E element = get(0);
        String id;
        if (element instanceof A) {
            id = ((A) element).getId();
        } else if (element instanceof B) {
            id = ((B) element).getId();
        } else {
            throw new IllegalArgumentException("Unsupported element type");
        }
        // 后续业务逻辑
    }
}

显然方案1更优雅、更安全,也符合开闭原则,无需修改原有A、B类的代码。

内容的提问来源于stack exchange,提问作者Anthraxff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:31:03