[英]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
不能SubException
為SubException
。
您可以創建一個靜態幫助器方法:
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.