使用迭代器在Java中输入推理?

时间:2015-06-03 15:30:44

标签: java collections iterator javac type-inference

关于Java中的类型推断,我有以下一小段代码:

class Test : public QDialog{
    Q_OBJECT
public:
    Test(QWidget *parent, QString app_language);

    // ...

signals:
    void filenameChanged(QString const &newFilename);

    // ...

private:
    QString language;
};

Test::Test(QWidget *parent, QString app_language)
: QDialog(parent), language(app_language), ui(new Ui::Report)
{
    ui->setupUi(this);
}

void Test::on_pushButton_clicked()
{
    emit filenameChanged("TEST CLASS");
}

// MAIN WINDOW CLASS

class MainWindow : public QMainWindow{
    Q_OBJECT
public:
    // ...

    void showTestClass();

public slots:
    void filename2Changed(QString const &newFilename);

private:
    QString filename2;
    QString app_language;
};

void MainWindow::showTestClass()
{
    Test test(this, app_language);
    connect(&test, &Test::filenameChanged, this, &MainWindow::filename2Changed);
    test.exec();
}

void MainWindow::filename2Changed(QString const &newFilename)
{
    filename2 = newFilename;
}

当我尝试打印名称类型不匹配时出现编译错误:无法从Object转换为String

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

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());
}

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

为什么不进行此类推断的任何原因?

1 个答案:

答案 0 :(得分:2)

Iterator也是一种通用类型。

您需要将其声明为Iterator<String> it = names.iterator();,以便在不进行投射的情况下将其元素引用为String

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

正如其他人所提到的那样,您只需打印原始Iterator的元素就不会出现编译错误 - 如果您引用不存在的projectNameList变量而不是,比如,names