我所有的自定义异常都有一个父类ParentException。我希望所有子异常都具有一种向异常添加消息的方法。为此,我创建了一个通用方法,该方法在向其添加消息后返回通用类型的对象。我在父类方法中使用this来添加消息,然后返回this,但是由于该方法返回了通用类型,因此我将其强制转换为通用类型T。这似乎可行,但会发出警告。我的代码如下:

public class ParentException extends RuntimeException{

    private String message;

    public ParentException() {
        message = "";
    }

    public void addToMessage(String msg) {
        message += msg;
    }

    public void printMessage() {
        System.out.println(message);
    }

    public <T extends ParentException> T withMessage(String msg) {
        this.addToMessage(msg);
        return (T) this; // This line gives the warning
    }
}


该行给出的警告为Unchecked cast from ParentException to T。该方法似乎确实按预期工作,因此我并不担心,但我想更好地理解为什么这首先会发出警告。

这个演员会永远安全吗?否则,哪种情况会导致运行时错误?

最佳答案

以下代码将编译,但在运行时将失败:

class ChildException extends ParentException { }

ParentException p = new ParentException();
ChildException c = p.withMessage("Connection failed");


我意识到写出来并没有多大意义,但是重点是,编译器警告有关不安全的强制转换可以首先阻止这种地雷。

10-02 15:09