簡體   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