类型推断失败:没有足够的信息来推断参数请明确指定

2024-02-27

我正在尝试用 Kotlin 编写 Vaadin 应用程序。对于数据绑定,Vaadin 8 现在提供了类型安全数据绑定的可能性。在 Kotlin 中,我期望这样的工作:

class LoginModel {
    var username: String = ""
    var password: String = ""
}

class LoginView : FormLayout() {
  val name = TextField("name")
  val password = TextField("password")
  val loginButton = Button("login")

  init {
      val binder = Binder<LoginModel>()
      binder.forField(name).bind(
          { it.username }, 
          { bean, value -> bean.username = value })

     //... 
  }
}

我在这里收到以下错误消息:

Error:(23, 31) Kotlin: Type inference failed: Not enough information to infer parameter BEAN in fun <BEAN : Any!, TARGET : Any!, BEAN : Any!> Binder.BindingBuilder<BEAN#1 (type parameter of bind), TARGET>.bind(p0: ((BEAN#1!) -> TARGET!)!, p1: ((BEAN#1!, TARGET!) -> Unit)!): Binder.Binding<BEAN#1!, TARGET!>!
Please specify it explicitly.

我尝试通过显式指定类型参数:

binder.forField(name).bind<LoginView, String, LoginView>(
    { it.username }, 
    { bean, value -> bean.username = value })

但这会导致错误消息(以及其他语法错误,所以我没有遵循这种方法)

Error:(23, 35) Kotlin: No type arguments expected for fun bind(p0: ValueProvider<LoginModel!, String!>!, p1: Setter<LoginModel!, String!>!): Binder.Binding<LoginModel!, String!>! defined in com.vaadin.data.Binder.BindingBuilder

我的第二种方法是尝试直接传递 Kotlin 属性访问器,但错误消息与第一种相同:

binder.forField(name).bind(LoginModel::username.getter, LoginModel::username.setter)

最后一种方法是尝试使用扩展方法并使所有内容尽可能明确:

fun <BEAN, TARGET> Binder.BindingBuilder<BEAN, TARGET>.bind(property: KMutableProperty1<BEAN, TARGET>) {

    fun set(bean: BEAN): TARGET = property.get(bean)
    fun get(bean: BEAN, value: TARGET): Unit = property.set(bean, value)
    this.bind(::set, ::get)
}

但它仍然会导致与第一个相同的错误消息


我已经尝试过你的示例,它在我的 Intellij 2017.1.4 和 Kotlin 1.1.2-5 上编译得很好。也许您在旧版本的 Kotlin 插件中发现了一个错误?

方法bind不接受泛型参数,因此无法泛化。这forField方法需要一个通用参数,所以也许你可以尝试

    binder.forField<String>(name).bind(
            { it.username },
            { bean, value -> bean.username = value })

但首先,请确保您拥有最新版本的 Kotlin 插件,和/或尝试使用 Intellij 社区版。

但是,我强烈建议您使用bind(String)因为其他绑定方法不适用于 JSR303 验证。您还可以定义以下扩展方法:

fun <BEAN, FIELDVALUE> Binder.BindingBuilder<BEAN, FIELDVALUE>.bind(prop: KMutableProperty1<BEAN, FIELDVALUE?>): Binder.Binding<BEAN, FIELDVALUE> =
        bind(prop.name)

并从您的代码中调用它,如下所示binder.forField(name).bind(LoginModel::username)。请参阅此处了解更多示例:https://github.com/mvysny/karibu-dsl/blob/master/example-v8/src/main/kotlin/com/github/vok/karibudsl/example/form/FormView.kt https://github.com/mvysny/karibu-dsl/blob/master/example-v8/src/main/kotlin/com/github/vok/karibudsl/example/form/FormView.kt

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类型推断失败:没有足够的信息来推断参数请明确指定 的相关文章

随机推荐

  • 如何使用 Java 以编程方式签署二进制 MS Office 文档?

    我们如何在 Apache POI 或任何其他开源库中对旧版二进制 MS Office 文档 doc xls ppt 进行数字签名 Open XML 格式包含在如何使用 Java 以编程方式签署 MS Office XML 文档 https
  • 使用 GridLayout 搞乱计算器

    我在使布局看起来漂亮方面遇到了麻烦 为了了解基础知识 我决定创建一个简单的计算器应用程序 因此 我使用嵌套在 LinearLayout 中的 GridLayout 将按钮放置在文本字段下 这是我的布局的来源
  • UIView 上圆形层的快速遮罩

    我试图用圆形 CAShapeLayer 快速掩盖方形 UIView 我有以下内容 var snapFrame self snapButton frame var innerFrame CGRect x snapFrame minX 1 y
  • 如何使用 CompletableFuture 并行运行多个服务调用?

    我正在向用户返回以下响应 class FinalResponseDTO List
  • Pygame PNG 图像看起来已损坏

    我正在跟进本指南 http www nerdparadise com tech python pygame basics part2 尝试在 Pygame 窗口中显示基本的 PNG 图像 我的图像是一个简单的 150x150 绿球 没有透明
  • 无法反序列化 lambda

    就像一个小项目一样 我一直在尝试制作一个小东西 读取序列化的 lambda 本地或从 FTP 并调用它们的运行函数作为测试的一部分 以试验 Windows 中的文件关联 即打开某些文件类型 用某个程序打开它们 等等 但无论我尝试什么 它似乎
  • getDimension()/getDimensionPixelSize() - 乘数问题

    所以我有 android 2 3 5 设备 它是 NORMAL HDPI 我的项目中有一个dimens xml
  • 从临时服务器连接到 GitoLite 时出错 - ECONNREFUSED 部署错误

    我在尝试将以前工作的项目部署到开发服务器时遇到了一些麻烦 我没有设置系统 但我确实拥有我需要的所有凭据 我认为 在尝试 cap staging 部署之后 我到目前为止 然后它产生了一个错误 请看下面 triggering load call
  • sed 用 C++ 注释替换(单行)C 注释

    我如何使用 sed 将源文件中的所有 C 风格注释替换为 C 风格 所有这些 int main some comments to int main some comments 所有注释都是单行 并且代码之间没有像这样的注释 int f in
  • 多层神经网络不会预测负值

    我已经实现了一个多层感知器来预测输入向量的正弦 这些向量由随机选择的四个 1 0 1 组成 偏差设置为 1 网络应该预测向量内容之和的 sin 例如 输入 输出 Sin 0 1 1 0 1 我遇到的问题是网络永远不会预测负值 并且许多向量的
  • 初始化 tkinter 类的父级/主控是什么?

    Note 示例代码是一个删节版本 但可以运行基本功能 请重点关注class MainWindow tk Frame 问题 什么样的object可以起到parent or master for tkinter class初始化 我的例子 看示
  • OpenGL重叠丑陋的渲染

    我正在尝试使用 OpenGL 2 1 渲染场景 但重叠形状的边框很奇怪 我测试了一些 OpenGL 初始化 但没有任何改变 我将问题简化为一个简单的测试应用程序 其中有 2 个球体 但结果相同 我尝试了一些关于 Gl DEPTH TEST
  • 警告:未找到提供程序 com.sun.xml.internal.bind.v2.ContextFactory

    我在 JSF 应用程序中集成了一些 Web 服务Jersey 一切正常 甚至 OAuth 识别也正常 但 当启动我的网络服务器时 我总是收到此错误 INFO Scanning for root resource and provider c
  • csrf 与 ajax 和 django post

    使用jquery v1 7 1和django 1 3 我试图通过ajax发出post请求 在我找到的一些教程代码中web http lethain com intro to unintrusive javascript with djang
  • 如何获取javafx中子节点的访问权限?

    我有一棵这样的树 正如您所看到的 GridPane 有 10 列 它们每个都包含包裹在 AnchorPane 中的 BorderPane 每个 BorderPane 由 2 个标签和 1 个单选按钮组成 您可以在下面看到它的样子 我想问您如
  • 如何从 javascript HTMLCollection 获取元素

    我不明白为什么我无法从 HtmlCollection 获取元素 此代码示例 var col document getElementsByClassName jcrop holder console log col 在控制台上产生以下输出 我
  • cv::warpPerspective 仅显示扭曲图像的一部分

    我使用 getHomography 和 warpPerspective 将图像从前视角更改为中视角 它的工作原理是图像扭曲到所需的视角 但裁剪被关闭 它将扭曲的图像大部分移动到图像框之外 我认为原因是因为操作导致负坐标 我已经手动计算了用于
  • Web API 令牌方案的好方法是什么?

    我正在为一个 Web 应用程序开发 REST API 到目前为止 我们已经在内部为几个配套应用程序开发了该 API 现在 我们正在考虑向外部开发人员开放 我们希望向 API 添加令牌 以帮助识别谁在发出请求 并总体上帮助管理其使用 此时 我
  • Jinja2 填充和对齐字符串

    我想实现类似的目标 https pyformat info string pad align https pyformat info string pad align 在 Jinja2 中 在 python 中 如果我希望字符串始终具有一定
  • 类型推断失败:没有足够的信息来推断参数请明确指定

    我正在尝试用 Kotlin 编写 Vaadin 应用程序 对于数据绑定 Vaadin 8 现在提供了类型安全数据绑定的可能性 在 Kotlin 中 我期望这样的工作 class LoginModel var username String