我有一个结构是这样的:使用泛型作为返回类型
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'接口将代码与特定的实现分离开来。就像你宁愿'列表