錯誤
public class DefaultLiteProcessScopeFactory<S extends DefaultLiteProcessScope> implements LiteProcessScopeFactory<S> {
@Override
public S build() {
return new DefaultLiteProcessScope();
}
}
對
public class DefaultLiteProcessScopeFactory<S extends DefaultLiteProcessScope> implements LiteProcessScopeFactory<S> {
@Override
public S build() {
return (S) new DefaultLiteProcessScope();
}
}
DefaultLiteProcessScope 擴展了 DefaultLiteProcessScope,但直到需要強制轉換?為什么?
uj5u.com熱心網友回復:
原因是代碼錯誤。
public class MyOtherFactory<SubclassOfDefaultLiteProcessScope> {}
將中斷,因為 DefaultLiteProcessScope 不是 SubclassOfDefaultLiteProcessScope。
uj5u.com熱心網友回復:
Sextends DefaultLiteProcessScope,所以你試圖回傳父類實體而不是子類實體。
uj5u.com熱心網友回復:
ClassCastException您的代碼將在以下情況下拋出 a :
class CustomLiteProcessScope extends DefaultLiteProcessScope { ... }
final DefaultLiteProcessScopeFactory<CustomLiteProcessScope> factory = new ...;
進而:
factory.build(); <-- Exception trying to cast DefaultLiteProcessScope to CustomLiteProcessScope
uj5u.com熱心網友回復:
你在這里做的是錯誤的。您想DefaultLiteProcessScope從該build方法回傳某個子型別。但是,您對回傳型別進行硬編碼,如下所示new DefaultLiteProcessScope():現在想一個像這樣稍微做作的例子。
static class SubType extends DefaultLiteProcessScope {
}
以及隨后的客戶端代碼。
final LiteProcessScopeFactory<SubType> f = new DefaultLiteProcessScopeFactory<>();
final SubType result = f.build();
現在,由于您已經硬編碼了回傳型別,您的編譯器無法保證代碼的型別安全。我希望它回傳子型別,但是您已經硬編碼了超型別。所以,它要求你添加一個明確的演員表,這很公平,不是嗎?事實上,這個轉換在運行時會拋出 a 失敗,因為無法java.lang.ClassCastException將超型別轉換為子型別。DefaultLiteProcessScopeSubType
怎么修。
更好的方法是將供應商作為引數傳遞給您的構建方法。
static class DefaultLiteProcessScopeFactory<S extends DefaultLiteProcessScope> implements LiteProcessScopeFactory<S> {
@Override
public S build(Supplier<S> s) {
return s.get();
}
}
static interface LiteProcessScopeFactory<S> {
S build(Supplier<S> s);
}
這是新的客戶端代碼。
final LiteProcessScopeFactory<SubType> f = new DefaultLiteProcessScopeFactory<>();
final SubType result = f.build(SubType::new);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474111.html
上一篇:無法分配接收泛型List并回傳List<?>的方法回傳的結果
下一篇:派生物件字典
