
ArrayList 不是独立类,而是参数化类型;它不可被“继承”为新类名,但可作为泛型基类被继承——关键在于理解泛型类型擦除与类继承的本质区别。
`arraylist
在 Java 中,ArrayList
正因如此,以下写法完全合法且常见:
public static class StringArrayList extends ArrayList<string> {
@Override
public boolean contains(Object o) {
if (o instanceof String) {
String target = (String) o;
for (String item : this) {
if (item != null && item.equals(target)) {
return true;
}
}
}
return false;
}
}</string>
这段代码之所以能编译通过,是因为 ArrayList
⚠️ 但需注意:这不是“扩展 ArrayList
回到你原始示例中 contains() 行为异常的问题——并非 ArrayList
// ❌ 错误写法:char + char → int(ASCII 相加),再转 String if (!star.contains(str.charAt(seq) + str.charAt(seq+1))) // 返回的是数字和的字符串,如 'a'+'b' → "195"
正确做法应显式构造字符串:
String pair = String.valueOf(str.charAt(seq)) + str.charAt(seq + 1);
if (!star.contains(pair)) {
star.add(pair);
}
✅ 或更简洁地使用 substring():
String pair = str.substring(seq, seq + 2);
if (!star.contains(pair)) {
star.add(pair);
}
? 总结建议:
- ✅ 可以继承 ArrayList
—— 语法合法、语义清晰,适用于需定制集合行为的场景; - ⚠️ 慎用继承替代组合 —— 若仅需修改某几个方法(如 contains),优先考虑封装 ArrayList
或使用 Stream/Collections 工具类; - ? 不要误认为 ArrayList
是实体类 —— 它是编译期类型安全工具,运行时无独立类身份; - ? 遇到 contains() 失效,先排查元素实际值(如 char 运算陷阱),再考虑是否真需继承。
泛型设计的本意是提升类型安全与复用性,而非制造新类层级。理解擦除机制,才能写出既正确又可维护的泛型代码。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











