3 回答

TA贡献1155条经验 获得超0个赞
基本上,它不够有用。
我认为您的示例指出了下限的唯一优势,即FAQ所称的功能Restricted Instantiation:
底线是:“超级” 绑定将为您提供的所有限制是,只有Number的超类型可以用作类型实参。....
但是,正如其他帖子所指出的那样,即使此功能的实用性也可能受到限制。
由于多态性和专业化的性质,如FAQ(访问非静态成员和清除类型)所述,上限比下限有用得多。我怀疑下限引入的复杂性不值得其有限的价值。
OP:我想补充一点,我想您确实表明它很有用,只是不够用。提出毫无疑问的杀手级用例,我将支持JSR。:-)

TA贡献1872条经验 获得超3个赞
规范确实谈到了类型参数的下限,例如
4.10.2
类型变量是其下限的直接超类型。
5.1.10
一个新鲜的类型变量...其下界
看起来,如果类型变量是通配符捕获的合成变量,则它只有一个(非空)下限。如果语言允许所有类型参数的下限怎么办?可能不会引起很多麻烦,并且仅是为了使泛型更简单而已被排除在外(好吧……)。更新:据说对下界类型参数的理论研究尚未彻底进行。
更新:一篇声称下限的论文是可以的:Daniel Smith撰写的“ Java类型推理被打破:我们可以解决它”
RETRACT:以下参数是错误的。OP的示例是合法的。
您的特定示例不是很令人信服。首先,它不是类型安全的。返回的列表确实是List<String>,将其视为另一种类型是不安全的。假设您的代码可以编译:
List<CharSequence> l2 = createArrayListFullOfEmptyStrings(5);
然后我们可以向其添加非字符串,这是错误的
CharSequence chars = new StringBuilder();
l2.add(chars);
好吧List<String>不是,但有点像CharSequence的列表。使用通配符可以解决您的需求:
public static List<String> createArrayListFullOfEmptyStrings(int size)
// a list of some specific subtype of CharSequence
List<? extends CharSequence> l2 = createArrayListFullOfEmptyStrings(5);
// legal. can retrieve elements as CharSequence
CharSequence chars = l2.get(0);
// illegal, won't compile. cannot insert elements as CharSequence
l2.add(new StringBuilder());

TA贡献2012条经验 获得超12个赞
这不仅仅是一个答案,这是另一个(可能是杀手??)用例。我有一个ModelDecorator助手。我希望它具有以下公共API
class ModelDecorator<T>{
public static <T> ModelDecorator<T> create(Class<T> clazz);
public <SUPER> T from(SUPER fromInstance);
}
因此,给定的类A,B扩展了A,则可以这样使用它:
A a = new A();
B b = ModelDecorator.create(B.class).from(a);
但是我想对T和SUPER进行限制,所以我确保只能使用API实例化子句。目前,我可以执行以下操作:
C c = new C();
B b = ModelDecorator.create(B.class).from(c);
其中B不从C继承。
显然,如果可以的话:
public <SUPER super T> T from(SUPER fromInstance);
那会解决我的问题。
添加回答
举报