相关疑难解决方法(0)

Kotlin泛型Array <T>导致"不能使用T作为一个改进的类型参数.请改用类"但List <T>不会

我有一个包含T和一些元数据的数组(或列表)的接口.

interface DataWithMetadata<T> {
    val someMetadata: Int
    fun getData(): Array<T>
}
Run Code Online (Sandbox Code Playgroud)

如果我编写最简单的接口实现,我会得到一个编译错误emptyArray():"不能使用T作为一个改进的类型参数.请改用类."

class ArrayWithMetadata<T>(override val someMetadata: Int): DataWithMetadata<T> {
    private var myData: Array<T> = emptyArray()

    override fun getData(): Array<T> {
        return myData
    }

    fun addData(moreData: Array<T>) {
        this.myData += moreData
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将接口和实现都更改为列表,我没有编译时问题:

interface DataWithMetadata<T> {
    val someMetadata: Int
    fun getData(): List<T>
}

class ListWithMetadata<T>(override val someMetadata: Int): DataWithMetadata<T> {
    private var myData: List<T> = emptyList()

    override fun getData(): List<T> {
        return myData
    }

    fun addData(moreData: Array<T>) { …
Run Code Online (Sandbox Code Playgroud)

java arrays generics reification kotlin

34
推荐指数
2
解决办法
1万
查看次数

由于它们位于加载程序“ app”的未命名模块中,因此无法转换为类

我正在尝试从生成的源创建一个bean wsdl2java

每次我尝试运行Spring Boot应用程序时,都会出现以下错误:

造成原因:java.lang.ClassCastException:org.apache.cxf.endpoint.ClientImpl类无法转换为com.xignite.services.XigniteCurrenciesSoap类(org.apache.cxf.endpoint.ClientImpl和com.xignite.services.XigniteCurrenciesSoap是在加载程序“ app”的未命名模块中)

我不确定我到底如何将生成的源作为模块包含在主Spring Boot应用程序中。

我的目录结构是:

??? build
?   ??? generatedsources
?       ??? src
?           ??? main
?               ??? java
?                   ??? com
?                       ??? xignite
?                           ??? services
?      
??? src
    ??? main
        ??? java
        ?   ??? io
        ?       ??? mateo
        ?           ??? stackoverflow
        ?               ??? soapconsumption
        ??? resources
           ??? wsdls
Run Code Online (Sandbox Code Playgroud)

相关系统信息:

openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
Run Code Online (Sandbox Code Playgroud)
  • Spring Boot 2.1.2发布
  • 摇篮5.2 …

java spring-boot java-9 java-module

23
推荐指数
1
解决办法
1万
查看次数

如何在Kotlin中创建一个充满空值的泛型数组?

我试过这个,代码没有编译.

class GenericClass<T>() {
    private var arr : Array<T>? = null

    {
        arr = Array<T>(10, { null })
    }
}
Run Code Online (Sandbox Code Playgroud)

kotlin

9
推荐指数
1
解决办法
4853
查看次数

Kotlin NDArray具有带通用返回类型的lambda构造函数

我正在尝试在Kotlin中创建一个非常简单的通用NDArray类,该类将lambda表达式用作初始化函数。

class NDArray<T>(i: Int, j: Int, f: (Int) -> T) {
    val values: Array<T> =  Array(i * j, f)
}
Run Code Online (Sandbox Code Playgroud)

典型的用法是:

fun main(args: Array<String>){
    val m = NDArray(4, 4, ::zero)
}

fun zero(i: Int) =  0.0
Run Code Online (Sandbox Code Playgroud)

我的问题是Kotlin编译器抱怨构造函数中的值初始化

values = Array(i * j, f)
Run Code Online (Sandbox Code Playgroud)

通过说“不能使用'T'作为化类型参数。改为使用类”。为什么呢

编辑:

如果我改为用自己的MyArray代替Kotlin Array实现,则会编译:

class NDArray<T>(i: Int, j: Int, f: (Int) -> T) {
    val values: MyArray<T> =  MyArray(i * j, f)
}

class MyArray<T>(i:Int, init: (Int) -> T) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

不确定当Kotlin具有相同的构造函数时,为什么Kotlin将MyArray与常规Array区别对待吗?

arrays generics type-erasure kotlin

5
推荐指数
1
解决办法
1284
查看次数