如何在自定义扩展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
相关产品推荐
相关产品推荐

