我有一个包含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) 我正在尝试从生成的源创建一个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)
我试过这个,代码没有编译.
class GenericClass<T>() {
private var arr : Array<T>? = null
{
arr = Array<T>(10, { null })
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在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区别对待吗?
kotlin ×3
arrays ×2
generics ×2
java ×2
java-9 ×1
java-module ×1
reification ×1
spring-boot ×1
type-erasure ×1