我们知道ArrayList.add
会返回boolean
,表示true
或false
。
现在需要进行自定义,当我们尝试在arrayList中添加null
时,它会返回一个自定义字符串。让我们说例如它就像这样
public String add(Element e) {
if (e == null) {
return "StackOverflow";
}
}
现在,当我看到层次结构List
界面和Collection
的返回类型add
都为boolean
时,没有提供覆盖它的内容。
请建议如何继续。
答案 0 :(得分:4)
如何使用:
String someMethod(Element e) {
if (e == null) {
return "StackOverflow";
}
theList.add(element);
return "someString"
}
答案 1 :(得分:1)
另一种方法是扩展ArrayList(或其他列表实现)。但是您需要该方法的另一个名称,例如addElement。
public class MyArrayList<E> extends ArrayList<E> {
public String addElement(E e) {
if(e == null){
return "StackOverflow";
} else{
super.add(e);
return "Other";
}
}
}
@Test
public void addElement() throws Exception {
MyArrayList<String> strings = new MyArrayList<>();
assertEquals("StackOverflow", strings.addElement(null));
assertEquals("Other", strings.addElement("other"));
}
答案 2 :(得分:1)
您无法使用相同的签名覆盖add方法并返回其他类型。由于add(T t)
接口在Collection
接口中定义为返回boolean
,因此类型层次结构中具有相同签名的所有方法都必须返回boolean
。
但是你可以:
通过添加更多参数来更改签名:
public class MyList<T> extends ArrayList<T> {
public String add(T t, String success, String error){
if (add(t)) {
return success;
} else {
return error;
}
}
}
或强>
使用其他方法名称更改签名:
public class MyList<T> extends ArrayList<T> {
public String addItem(T t){
if (add(t)) {
return "success";
} else {
return "error";
}
}
}
或强>
使用包含ArrayList
聚合的包装类来执行基础操作。但是你必须实现所有方法get, add, size, etc
public static class MyArrayList<T> {
private List<T> list;
public MyArrayList() {
this.list = new ArrayList<T>();
}
public String add(T t) {
if (list.add(t)) {
return "success";
} else {
return "error";
}
}
public T get(int index) {
return list.get(index);
}
}