【发布时间】:2015-08-18 19:59:14
【问题描述】:
我有这样的结构:
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);
}
实现为:
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 对象的唯一入口点,并且对工厂的调用从不使用具体类(但总是像:@987654332 @),问题是:这个新版本安全吗?
【问题讨论】:
标签: java generics return type-safety