创建两个具有相同方法名称的实现;一个来自@Override,另一个来自派生

时间:2018-08-09 19:14:02

标签: java iterator method-overriding

我知道这个问题已经被问了一百万遍了,但是我不确定我是否有需要的解决方案。这个问题很可能会回答“否”,但我愿意接受其他解决方案。

我正在实现自己的Exception类,该类是从另一个也实现Iterable的类扩展的。

class TCBPackageException extends TCBRuntimeException implements Iterable<TCBRuntimeException> {

private List<TCBRuntimeException> exceptions = new LinkedList<>();

TCBPackageException(Throwable t) {
    super(t);
}

class TCBPackageIterator extends Iterator<TCBRuntimeException> {

    public boolean hasNext() {
        ...
    }
    public TCBRuntimeException next() {
        ...
    }
}

public void addException(TCBRuntimeException e) {
    exceptions.add(e);
}


//  Here's My ISSUE


// When getMessage() is Called on TCBPackageException I want the accumulation of all the messages stored.

@Override
public String getMessage() {
    StringBuffer buffer = new StringBuffer(super.getMessage());
    for (TCBException ex : exceptions) {
        buffer.append(ex.getMessage());
    }
    return buffer.toString();
}

// If I use an Iterator and end up getting this as the FIRST object, I just want the message of THIS exception.
public String getMessage() {
    return super.getMessage();
}

1 个答案:

答案 0 :(得分:1)

来自https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

  

Java编程语言支持重载方法,并且Java可以区分具有不同方法签名的方法。这意味着,如果类中的方法具有不同的参数列表,则它们可以具有相同的名称(对此有一些限定条件,将在标题为“接口与继承”的课程中进行讨论)。

考虑到这一点,您不能定义两个具有绝对相同签名的方法(@Override之类的注释不属于签名)。如果您定义两个方法getMessage()而没有任何区别,则编译器将不知道您正在尝试o.getMessage()调用哪个方法。

您必须使用不同的名称或定义不同的参数集。提案:

@Override
public String getNestedMessages() {

    StringBuffer buffer = new StringBuffer(super.getMessage());

    for (TCBException ex : exceptions) {

        buffer.append(ex.getMessage());

    }

    return buffer.toString();

}

第二种方法getMessage()绝对是过时的,因为如果不重写它,则会自动从超类中调用它。