为什么在Java中,泛型类型参数不能有下界限制?

7 浏览
0 Comments

为什么在Java中,泛型类型参数不能有下界限制?

据我了解,你无法将Java泛型类型参数绑定到下界(即使用super关键字)。我正在阅读Angelika Langer泛型FAQ中对此问题的解释。他们说这基本上归结为下界没有用处("没有任何意义")。

但我并不认同。我可以想象它们的用途是帮助你更灵活地处理库方法的调用者,该方法会生成一个带有类型的结果。想象一个创建指定大小并用空字符串填充的数组列表的方法。一个简单的声明可能是:

public static ArrayList createArrayListFullOfEmptyStrings(int i);

但这对于你的客户来说是不必要的限制。为什么他们不能这样调用你的方法:

//应该编译通过
List l1 = createArrayListFullOfEmptyStrings(5); 
List l2 = createArrayListFullOfEmptyStrings(5);
List l3 = createArrayListFullOfEmptyStrings(5);
//不应该编译通过
List l4 = createArrayListFullOfEmptyStrings(5);

此时,我会尝试以下定义:

public static  List 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 list, int size);
List list = new ArrayList();
populateListWithEmptyStrings(list, 5);

为了这个问题的目的,我们能否假设由于要求,我们需要在一个方法调用中执行这两个操作?

编辑

@Tom G(理所当然地)问有一个List相对于List的好处是什么。首先,没有人说返回的列表是不可变的,所以这里有一个优势:

List l2 = createArrayListFullOfEmptyStrings(5);
l2.add(new StringBuilder("foo").append("bar"));

0