我对Java很新,在我看来
Iterable<? extends String>
只能是
Iterable<String>
因为String是final,而不能派生自。我错了吗?
答案 0 :(得分:4)
你的观察是真实有效的,并没有多少补充。
所以我预计下一个问题(正如我在评论中所做的那样,只是作为格式化原因的答案):如果唯一可能的定义是{{1},为什么会使用Iterable<? extends String>
}?
说实话:对于Iterable<String>
,您没有任何方法可以添加任何内容,因此它没有多大意义。但是,我们可以将Iterable
替换为Iterable
。
List
和List<? extends String>
之间的区别是什么?
使用List<String>
编译器知道该列表包含List<String>
个对象,因此它允许您调用String
。
但是对于add("newStringLiteral")
,编译器不再那么肯定了。当然,我们不能扩展List<? extends String>
,但编译器不会检查它,因此必须假设它是可能的。
现在让我们假装我们能够写一个班级String
。如果我们要调用SpecialString extends String
,我们希望将列表限制为仅包含List<? extends String> l = new ArrayList<SpecialString>()
个对象。但是编译器只看到SpecialString
因此它假设可能对实际类型有限制,因此认为List<? extends String>
是错误。
因此,使用add("newStringLiteral")
基本上会将参数设为一个列表,您无法添加任何内容(只需读取和删除)。
答案 1 :(得分:3)
其他答案已经解释过您对? extends String
的假设是正确的。但是当你提出问题时,有一个问题。
Iterable<? extends String>
是否可以包含除{。}之外的任何内容 字符串?
您可以轻松构建一个Iterable<String>
,它可以包含任何对象,而不仅仅是字符串:
ArrayList a = new ArrayList();
a.add(Boolean.TRUE);
@SuppressWarnings("unchecked")
Iterable<String> i = a;
Object elem = i.iterator().next();
assert elem == Boolean.TRUE;
答案 2 :(得分:0)
是的,是的。唯一有效的Object将是String。
答案 3 :(得分:0)
这是正确的,String不能扩展,因为它是最终的语句
Iterable<? extends String>
没有多大意义。
答案 4 :(得分:0)
由于string
是最后一堂课,所以确实如此。