关于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()方法。
为什么不进行此类推断的任何原因?
答案 0 :(得分:2)
Iterator
也是一种通用类型。
您需要将其声明为Iterator<String> it = names.iterator();
,以便在不进行投射的情况下将其元素引用为String
。
将其声明为原始类型实际上会告诉编译器您希望引用为Iterator<Object>
。
正如其他人所提到的那样,您只需打印原始Iterator
的元素就不会出现编译错误 - 如果您引用不存在的projectNameList
变量而不是,比如,names
。