我最近遇到了以下模式的实例:
public interface IFooFactory {
<K> Foo<K> create();
}
Run Code Online (Sandbox Code Playgroud)
请看这里的具体例子.我没有看到客户端程序员在创建除了实例化Foo之外应该做什么,而是使用Object的正式类型参数或者根本没有正式的类型参数.我也没有看到框架设计者试图通过这种方式定义接口IFooFactory来表达的好处或类型约束.
好处是方法的用户,而不是实施者.Collections.emptyList()是这种模式有益使用的一个很好的例子.它允许您声明一个这样的空列表:
List<String> myEmptyList = Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)
如果方法返回一个raw List,List<Object>或者List<?>,使用这种方法的方法将需要一个强制转换.
考虑Collections.emptyList().返回的列表对象始终是相同的:由于列表为空且不可变,因此调用者无法对返回的对象执行任何操作,以使其显示不同的行为,具体取决于替换type参数的具体类型.因此,单个实现(具有原始类型)就足够了:
public static <T> List<T> emptyList() {
return THEEMPTYLIST;
}
public static final List THEEMPTYLIST = new List() {
public int size() { return 0; }
...
};
Run Code Online (Sandbox Code Playgroud)
但是,该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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
313 次 |
| 最近记录: |