如何在ArrayList中筛选与指定实例同类型的Packable元素?
解决方法
你报错的核心原因是isAssignableFrom()是Class类的方法,不能直接通过Packable实例调用。需要先获取参考实例的Class对象,再调用该方法做类型校验。
修正后的基础实现
public List<Packable> getOfType(Packable reference){ List<Packable> typeOfItems = new ArrayList<>(); // 获取参考实例对应的Class对象 Class<?> referenceClass = reference.getClass(); for (Packable item : itemsStored) { // 校验item的类型是否为参考类型的子类或本身 if (referenceClass.isAssignableFrom(item.getClass())){ typeOfItems.add(item); } } return typeOfItems; }
额外优化说明
- 如果需要严格匹配完全相同的类型(不包含子类),可以直接用
==比较Class对象:if (referenceClass == item.getClass()) { typeOfItems.add(item); } - 进阶泛型优化:让返回列表的类型更安全,避免后续强制转换。这种方式直接传入Class对象,比传入实例更灵活:
public <T extends Packable> List<T> getOfType(Class<T> referenceClass){ List<T> typeOfItems = new ArrayList<>(); for (Packable item : itemsStored) { if (referenceClass.isInstance(item)){ typeOfItems.add(referenceClass.cast(item)); } } return typeOfItems; } // 调用示例:getOfType(ConcretePackable.class)
内容的提问来源于stack exchange,提问作者MrYummy8626
相关产品推荐
相关产品推荐

