繁体   English   中英

Java:当泛型为时,在父类中强制转换为泛型类型是安全的 <T extends Parent> ?

[英]Java: Is casting to generic type in parent class safe when generic is <T extends Parent>?

我的所有自定义异常都有一个父类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");

我意识到编写它并没有多大意义,但是重点是,编译器警告有关不安全的强制转换可以从一开始就防止这种地雷。

考虑这种情况:

class SubException extends ParentException {...}

ParentException ex = new ParentException();
SubException sub = ex.withMessage("blah");

最后一行将抛出类ParentException异常,因为ParentException不能SubExceptionSubException


您可以创建一个静态帮助器方法:

class ParentException extends RuntimeException{
    ...
    protected static <T extends ParentException> T withMessage(T instance, String msg) {
        instance.addToMessage(msg);
        return instance;
    }

    public ParentException withMessage(String msg) {
        return withMessage(this, msg);
    }
}

并使用协变返回类型覆盖此方法:

class SubException extends ParentException {
    @Override
    public SubException withMessage(String msg) {
        return withMessage(this, msg);
    }   
}

然后,如果您有SubException变量,则对withMessage的调用withMessage将返回SubException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM