我最近遇到了以下模式的实例:
public interface IFooFactory {
<K> Foo<K> create();
}
有关具体示例,请参阅here。除了使用对象的正式类型参数实例化 Foo 之外,我没有看到客户端程序员在实现创建时应该做什么或者根本没有正式的类型参数。我也没有看到框架设计者试图通过这种方式定义接口 IFooFactory 来表达的好处或类型约束。
答案 0 :(得分:5)
好处是方法的用户,而不是实施者。 Collections.emptyList()
是有效利用这种模式的一个很好的例子。它允许您声明一个这样的空列表:
List<String> myEmptyList = Collections.emptyList();
如果方法返回原始List
,List<Object>
或List<?>
,则以这种方式使用此方法需要强制转换。
答案 1 :(得分:5)
考虑Collections.emptyList()
。返回的列表对象始终是相同的:由于列表为空且不可变,因此调用者无法对返回的对象执行任何操作,以使其显示不同的行为,具体取决于替换type参数的具体类型。因此,单个实现(具有原始类型)就足够了:
public static <T> List<T> emptyList() {
return THEEMPTYLIST;
}
public static final List THEEMPTYLIST = new List() {
public int size() { return 0; }
...
};
emptyList
方法使调用者更方便,因为它启用了类型推断:
List<String> noStrings = Collections.EMPTY; // Gives compiler warning due to use of raw types
List<String> noStrings2 = Collections.emptyList(); // No compiler warning, type parameter inferred.
答案 2 :(得分:1)
嗯......这很容易......我不知道客户端程序员应该做什么 除了使用正式类型实例化Foo之外的create的实现 Object的参数或根本没有正式的类型参数。
<K> Foo<K> create() {
return new Foo<K>();
}