我有一個結構是這樣的:使用泛型作爲返回類型
abstract class MyDomain{...}
abstract class FooDomain extends MyDomain{...}
abstract class BarDomain extends MyDomain{...}
class FirstConcreteBarDomain extends BarDomain{...}
class SecondConcreteBarDomain extends BarDomain{...}
我需要一個工廠,創建MyDomain
對象。我第一次嘗試是這樣的:
public interface ISpecializedObjectsFactory {
public <T extends MyDomain> T create(Class<?> clazz);
}
Implementend爲:
public class FirstSpecializedObjectsFactory implements ISpecializedObjectsFactory {
@Override
public <T extends MyDomain> T create(Class<?> clazz) {
if(clazz.equals(BarDomain.class))
return new FirstBarDomain();
throw new InvalidParameterException();
}
相同的SecondBarDomain
。
第一個問題:爲什麼這會產生一個錯誤,指出它不能投出FirstBarDomain
到T
?
此錯誤後,我已經介紹了演員:return (T) new FirstBarDomain();
。
的問題是,中投是不安全的,我想是有信心的結果,所以我介紹了另一個約束(假設每個MyDomain
對象始終有2級的推導):
public <T extends AnagrafeDomain, S extends T> S create(Class<T> clazz)
第二個問題:假設這個工廠是創建對象MyDomain
的唯一入口點,並且對工廠的調用從不使用具體類(但總是像:BarDomain subj = SpecializedObjectsFactory.getFactory().create(BarDomain.class);
),問題是:此新版本是否安全?
OP表示「調用工廠從不使用具體類」 –
@ sharonbn正確,但仍然不能安全;即使'''MyFakeDomain''是'''abstract''',它仍然會導致完全相同的問題。爲了避免混淆,我會明確地將其抽象化。 – Toby
這會和應該通過類拋出異常。當然你會使用'BarDomain'接口將代碼與特定的實現分離開來。就像你寧願'列表