Java: 扩展 ArrayList 有 add() return 对象

Java: Extending ArrayList have add() return Object

扩展 ArrayList 时 class 你也可以编辑它的方法,对吧?

我想从 ArrayList 扩展并使 add() 方法 return 成为对象而不是布尔值(或 void)。所以我可以这样做:

CustomObject o = objectList.add(new CustomObject("myObject"));

这将是 class:

public static class ObjectList extends ArrayList<CustomObject>{
    public CustomObject add(CustomObject object){
        super.add(object);
        return object;
    }
    public CustomObject add(int index, CustomObject object){
        super.add(index, object);
        return object;
    }
}

但这行不通,因为这些方法通常 return 布尔值或 void,如 Java 文档中所述:http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#add(E)

那么这是否可以通过其他方式实现?

感谢您的帮助。

您需要选择不同的方法名称,例如addAndReturn.

原因是方法重载在 Java 中不起作用,如果方法仅在 return 类型上有所不同(参见 Overload with different return type in Java?)。

PS:您还应该考虑处理原始 add 方法的 return 值,如果由于某种原因添加失败,可能 return null .

在重写 Java 中的方法时应考虑一些规则,您的场景位于第一点。

  1. Return 覆盖方法的类型必须与覆盖方法相同。尝试更改子 class 中的 return 类型的方法将抛出编译时错误 "return type is incompatible with parent class method".

  2. 方法只能在子 class 中被覆盖,不能在同一个 class 中覆盖。如果您尝试在一个 class 中创建两个具有相同签名的方法,编译器会抱怨说 "duplicate method in type Class".

  3. 覆盖方法不能抛出层级高于被覆盖方法抛出的已检查异常的已检查异常。例如,如果被覆盖的方法抛出 IOException 或 ClassNotfoundException,它们被检查为异常,那么覆盖方法不能抛出 java.lang.Exception 因为它在类型层次结构中更高(它是 IOException 和 ClassNotFoundExcepiton 的超级 class)。

  4. 覆盖方法不能减少被覆盖方法的访问。这意味着如果覆盖方法被定义为 public 则覆盖方法不能被保护或包私有。同样,如果原始方法受到保护,则覆盖方法不能是包私有的。

  5. 覆盖方法可以增加被覆盖方法的访问。这与之前的规则相反,根据这一点,如果重写方法被声明为受保护的,那么重写方法可以被保护或 public.

  6. private、static 和 final 方法不能在 Java 中被覆盖。顺便说一句,您可以隐藏私有和静态方法,但尝试覆盖最终方法将导致编译时错误 "Cannot override the final method from a class"