mvvmFX 在 ViewTuple 中为已实现的 ViewModel 抛出不兼容的类型

mvvmFX Throws Incompatible Type in ViewTuple for Implemented ViewModel

我创建了一个示例项目,如 getting started documentation of mvvmFX 所示。我的 MainViewModel 按预期实现了 de.saxsys.mvvmfx.ViewModel。除了 class 名称外,内容与文档中的内容相同。

奇怪的是,start 方法中的 ViewTuple 不接受 MainViewModel 作为兼容。

Error:(28, 102) java: incompatible types: de.saxsys.mvvmfx.ViewTuple<com.erayerdin.imageviewer.views.MainView,de.saxsys.mvvmfx.ViewModel> cannot be converted to de.saxsys.mvvmfx.ViewTuple<com.erayerdin.imageviewer.views.MainView,com.erayerdin.imageviewer.viewmodels.MainViewModel>

那么,为什么 MainViewModel 实施 de.saxsys.mvvmfx.ViewModelViewTuple 不兼容?


代码

App.java

package com.erayerdin.imageviewer;

import com.erayerdin.imageviewer.viewmodels.MainViewModel;
import com.erayerdin.imageviewer.views.MainView;
import de.saxsys.mvvmfx.FluentViewLoader;
import de.saxsys.mvvmfx.ViewTuple;
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.util.List;

public class App extends Application {
    public static List<String> PARAMS;

    public static void main( String[] args ) {
        launch(args);
    }

    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Reian ImageViewer");

        ViewTuple<MainView, MainViewModel> viewTuple = FluentViewLoader.fxmlView(MainView.class).load();
        Parent root = viewTuple.getView();
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}

MainView.java

package com.erayerdin.imageviewer.views;

import com.erayerdin.imageviewer.viewmodels.MainViewModel;
import de.saxsys.mvvmfx.FxmlView;
import de.saxsys.mvvmfx.InjectViewModel;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

import java.net.URL;
import java.util.ResourceBundle;

public class MainView implements FxmlView<MainViewModel>, Initializable {
    @FXML private Label helloLabel;

    @InjectViewModel
    MainViewModel controller;

    public void initialize(URL location, ResourceBundle resources) {
        helloLabel.textProperty().bind(controller.helloMessageProperty());
    }
}

MainViewModel.java

package com.erayerdin.imageviewer.viewmodels;

import de.saxsys.mvvmfx.ViewModel;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class MainViewModel implements ViewModel {
    private StringProperty helloMessage = new SimpleStringProperty("Hello World!");

    public String getHelloMessage() {
        return helloMessage.get();
    }

    public StringProperty helloMessageProperty() {
        return helloMessage;
    }

    public void setHelloMessage(String helloMessage) {
        this.helloMessage.set(helloMessage);
    }
}

环境

这个问题很可能是由于 Java 版本错误造成的。即使您使用的是 Java 8,我假设您的 IDE/Build 系统配置的是较旧的 Java 版本。

FluentViewLoader 中使用的类型推断在以前的 java 版本中是不可能的。

我用一个标准的 maven 项目测试了你的 类 并得到了同样的错误,因为默认情况下 maven 使用 Java 1.5(据我所知)。然后我更改了 Maven 设置,以便编译器使用 1.8 版作为源和目标版本,如下所示:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

使用此设置,它按预期工作。