当前位置: 首页 > 知识库问答 >
问题:

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

阎佑运
2023-03-14

我正在尝试用科特林编写一个Vaadin应用程序。对于数据绑定,Vaadin 8 现在提供了类型安全数据绑定的可能性。在科特林,我本来以为会有这样的工作:

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

但是这导致了错误消息(和其他sytax错误,所以我没有遵循这种方法)

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

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

共有3个答案

齐永昌
2023-03-14

由于您的模型相当简单,您可以通过Binder#bind(StringpropertyName)方法连接到具有给定名称的属性来完成绑定

val binder = Binder<LoginModel>()
binder.forField(name).bind("username");
卢枫涟
2023-03-14

您必须使用API级别26。此版本更改了View.findViewById()的签名-请参见此处https://developer.android.com/preview/api-overview.html#fvbi-signature

查找视图字节 Id 的结果是模棱两可的,您需要提供以下类型:

例如:

val myTextView = findViewById(R.id.list) as TextView

成为

val myTextView = findViewById<TextView>(R.id.myTextView)
彭星津
2023-03-14

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

方法<code>bind</code>不接受泛型参数,因此无法对其进行泛型化。forField</code>方法接受一个泛型参数,因此您可以尝试

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

但首先,请确保您拥有最新版本的静态编程语言插件,和/或可能尝试使用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

 类似资料:
  • 我有一个比较来自两个不同endpoint的响应的函数。它看起来像这样: 如您所见,调用方可以传入有关如何从两个终结点的响应生成响应字符串的函数。我还有一个响应生成器的默认函数。它们看起来像这样: 这在IntelliJ中编译得很好。然而,当我运行gradle构建时,它失败了,并显示错误 我做错了什么?我在毕业设计中使用了Kotlin 1.6.10。

  • 我正试图为我的android应用程序编写一些测试,这对我来说是一个挑战。这个错误是许多障碍之一 哪一个发生在这条线上 完整的测试代码如下所示 基本上,shadowOf函数是重载的,可以返回很多thinks,我需要指定类型。 我相信它应该是类似< code>shadowOf的东西 任何帮助都将不胜感激。 EDIT我遵循机器人技术指南,但尝试用androidX的方式编写

  • 在一个纯Kotlin项目中,我使用JUnit Jupiter 5.5.2和AssertJ3.10.0。以下测试成功执行: 一旦我更新到AssertJ3.11.1,测试构建就会失败,出现以下消息: 我试图弄清楚发生了什么--但没有成功。 JUnit5问题#1209:在没有显式指定泛型类型的情况下,无法在Kotlin中调用“fail”

  • 当用户确认付款时,我尝试在Paypal Sdk上获取交易详细信息。但是,下面的代码遇到了问题 遇到的问题: 类型推断失败:信息不足,无法推断中的参数T 享乐 对于此行:val confirm=data。getParcelableExtra(PaymentActivity.EXTRA_结果_确认) 不确定这对字符串(4)意味着什么: val paymentDetails=confirm。toJSON

  • 我使用一个密封类从网络返回数据。但是当我在构建这个项目时,我得到了以下错误 类型推断失败:没有足够的信息来推断参数T in fun error(错误消息:String,错误:Throwable):状态请明确指定它。 我错过了什么? 这是代码

  • 我试图使用Kotlin在我的Android应用程序中复制以下ListView:https://github.com/bidrohi/kotlinListView。 不幸的是,我得到了一个错误,我无法解决自己。下面是我的代码: 布局如下:https://github.com/bidrohi/kotlinlistview/tree/master/app/src/main/res/layout 我得到的