为什么在Java中,泛型类型参数不能有下界限制?
为什么在Java中,泛型类型参数不能有下界限制?
据我了解,你无法将Java泛型类型参数绑定到下界(即使用super
关键字)。我正在阅读Angelika Langer泛型FAQ中对此问题的解释。他们说这基本上归结为下界没有用处("没有任何意义")。
但我并不认同。我可以想象它们的用途是帮助你更灵活地处理库方法的调用者,该方法会生成一个带有类型的结果。想象一个创建指定大小并用空字符串填充的数组列表的方法。一个简单的声明可能是:
public static ArrayListcreateArrayListFullOfEmptyStrings(int i);
但这对于你的客户来说是不必要的限制。为什么他们不能这样调用你的方法:
//应该编译通过 List
此时,我会尝试以下定义:
public staticList createArrayListFullOfEmptyStrings(int size) { List list = new ArrayList (size); for(int i = 0; i < size; i++) { list.add(""); } return list; }
但它无法编译通过;在这个上下文中,super
关键字是非法的。
上述示例是否是一个糟糕的示例(忽略我下面说的)?为什么在这里下界没有用处?如果下界有用的话,不允许在Java中使用的真正原因是什么?
P.S.
我知道更好的方法可能是这样的:
public static void populateListWithEmptyStrings(List super String> list, int size); Listlist = new ArrayList (); populateListWithEmptyStrings(list, 5);
为了这个问题的目的,我们能否假设由于要求,我们需要在一个方法调用中执行这两个操作?
编辑
@Tom G(理所当然地)问有一个List
相对于List
的好处是什么。首先,没有人说返回的列表是不可变的,所以这里有一个优势:
Listl2 = createArrayListFullOfEmptyStrings(5); l2.add(new StringBuilder("foo").append("bar"));