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

Java/静态编程语言泛型列表与通配符不兼容的类型

萧伟兆
2023-03-14

我有一个抽象Java类,其中包含一个调用子类中的方法的具体方法:

abstract class JavaSuperclass<T> {
    T doSomething() {
        ...
        return doSomethingInSubclass();
    }

    abstract T doSomethingInSubclass();
}

我有一个Java子类,其泛型类型设置为列表:

class JavaSubclass extends JavaSuperclass<List<WhateverJava>> {
    List<WhateverJava> doSomethingInSubclass() {...}
}

我有一个Kotlin子类:

class KotlinSubclass : JavaSuperclass<List<WhateverKotlin>> {
    override fun doSomethingInSubclass(): List<WhateverKotlin> {...}
}

WhateverJava是一个Java类,WhateverKotlin是一个Kotlin数据类。)

然后在Java类中,我使用两个子类。

List<WhateverJava> listFromJava = javaSubclass.doSomething();
List<WhateverKotlin> listFromKotlin = kotlinSubclass.doSomething();

调用Java子类的行编译正常,但是调用静态编程语言子类的行给出了这个错误:

error: incompatible types: List<capture<? extends WhateverKotlin>> cannot be converted to List<WhateverKotlin>

共有1个答案

杜阳炎
2023-03-14

静态编程语言中的列表是协变的。因此,静态编程语言类Java:

class KotlinSubclass extends JavaSuperclass<List<? extends WhateverKotlin>>

向Kotlin类添加JVSUPPressWildcards注释可以修复此问题。

class KotlinSubclass : JavaSuperclass<@JvmSuppressWildcards List<WhateverKotlin>> {
    override fun doSomethingInSubclass(): List<WhateverKotlin> {...}
}
 类似资料:
  • 我正在Kotlin进行大师/细节流程活动。我有碎片不匹配的问题,因为在一个活动中我需要Android。支持v4.app。Fragment和其他android。应用程序。碎片我实现了自己的细节片段,并继承了Android系统。支持v4.app。用于修复ListActivity中supportFragmnet事务中不匹配的片段 但是,我在DetailActivity中的fragmentManager中

  • 在stackoverflow中还没有讨论的情况下,我遇到了“不兼容类型”编译器错误(例如,为什么这个通用java代码不能编译?)。 我的期望很简单--我调用的是一个模板化方法,它不使用包含类的任何“泛型”类,因此它应该从方法参数中提取模板参数的类型,并且在所有情况下都应该编译--但我得到了“不兼容类型”编译器错误。 我注意到解决这个问题的奇怪方法--在方法参数中向泛型datatype添加“<?ex

  • 有了这个数据模型... TestClass.kt 我的目标是反序列化以下json值: 我在这里看到了解决方案并尝试了这个,但是我的“反序列化”方法中的断点似乎永远不会命中。 选项Deserializer.java TestDeserialization.kt 建筑gradle(用于版本信息)

  • 我定义jackoson序列化器并将其添加到java类中,如下所示: 编译器出现以下错误: 注释的定义为: 如果我从ReportFilterDeserializer中删除泛型attibute,它将通过编译。我不明白编辑为什么抱怨。

  • 以下是这个问题,它提供了一个解决方案,但没有解释它(不幸的是,答案中的链接现在没有了): WTF???在上调用返回一个,该不能赋值给类型为的变量,但可以赋值给类型为的变量?扩展Map.Entry >????? 有人能说说这是怎么回事吗?这是否意味着,每当我使用至少2层深度的通配符类型编写方法时,我都必须记住将其设置为在什么地方?

  • 问题内容: 我正在刷新有关Java泛型的知识。因此,我转向了Oracle的优秀教程……并开始为我的同事编写一个演示文稿。我在本教程中遇到了有关通配符的部分,内容为: 考虑以下方法,printList: printList的目标是打印任何类型的列表,但未能实现该目标- 它仅打印Object实例的列表;它不能打印,,,等等,因为它们不是的亚型。要编写通用的printList方法,请使用: 我知道那是行