【问题标题】:Type Inference in Java with Iterators?使用迭代器在 Java 中进行类型推断?
【发布时间】:2015-06-03 15:30:43
【问题描述】:

关于Java中的类型推断,我有以下小sn-p代码:

ArrayList<String> projectNameList = new ArrayList<String>(3);
projectNameList.add("Joe");
projectNameList.add("Jim");
projectNameList.add("Josh");

Iterator it = names.iterator();

while(it.hasNext()){
   System.out.println(it.next());
}

当我尝试打印名称时出现编译错误 Type mismatch: cannot convert from Object to String

我知道要解决这个问题,我需要做的就是将 Object 显式转换为 String,或者显式声明此迭代器返回的元素类型为 String 类型,如下所示:

Iterator it<String> = names.iterator();

但我原以为 javac 编译器会足够聪明地推断迭代器返回的类型是字符串,因为 iterator() 方法是在字符串的 ArrayList 上调用的。

没有发生这种类型推断的任何原因?

【问题讨论】:

  • 我不相信你的例子给出了这个错误。
  • 你实际上会得到一个错误,projectNameList 没有被声明。如果你修复它,你根本不会得到任何编译错误。
  • 请发布您的实际代码
  • 抱歉,这里有一个错字,该列表是用名称 projectNameList 声明的。更新了我的问题。

标签: java collections iterator javac type-inference


【解决方案1】:

Iterator 也是泛型类型。

您需要将其声明为 Iterator&lt;String&gt; it = names.iterator(); 以将其元素引用为 Strings 而无需强制转换。

将其声明为原始类型实际上会告诉编译器您希望引用为Iterator&lt;Object&gt;

正如其他人所提到的,仅打印原始 Iterator 的元素不会导致编译器错误 - 如果您引用不存在的 projectNameList 变量而不是 names,则会出现编译器错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2020-04-21
    • 2022-11-07
    • 1970-01-01
    相关资源
    最近更新 更多