【发布时间】:2016-06-13 14:12:03
【问题描述】:
有这个接口:
public interface ServiceLocator {
<T> void setService(Class<T> klass, Factory<T> factory)
<T> void setConstant(Class<T> klass, T value)
<T> T getObject(Class<T> klass)
}
如何实现它?我的意思是,我如何声明结构数据? 是这样吗?
private Map<Class, Factory> services = new HashMap<>();
private Map<Class, Object> constants = new HashMap<>();
【问题讨论】:
-
就是这样,您仍然可以添加通配符来摆脱原始类型的警告。
Map<Class<?>, Factory<?>>. -
但是使用泛型来拥有安全类型难道不是重点吗?我指的是具有 Object 类型的
constantsdeclaration。有了这个,当我对一个常量执行getObject时,我不得不进行强制转换:(T) constants.get(klass);这不对,不是吗? -
您无法通过类型系统获得那种级别的安全性。但是你已经(大部分)以封装的形式拥有它。
-
没有安全的方法让 Map 为每个键返回不同的泛型类型。
-
Java 类型系统不足以证明您所做的是类型安全的。您可以自己证明这一点,并使用不安全的强制类型转换将其隐藏在类型系统中,但这是您能做的最好的事情。