小编Tom*_*son的帖子

Kotlin:泛型,反射和T型和T型之间的区别:任何

如果我尝试访问泛型类型T的javaClass,Kotlin编译器会抱怨T不是kotlin的子类型.Any

class Foo<T> (val t: T ){
    val cls = t.javaClass // Error, T is not a subtype of kotlin.Any
}
Run Code Online (Sandbox Code Playgroud)

如果将T定义为Any的子类型,则一切正常.

class Bar<T:Any> (val t: T ){
    val cls = t.javaClass // OK
}
Run Code Online (Sandbox Code Playgroud)

Q1)如果类型'T'不是'Any'的子类型,哪个类/类可以是?的子类型?

Q2)对于T的所有实例是否存在javaClass,如果存在,我该如何访问它?

generics reflection kotlin

10
推荐指数
1
解决办法
1142
查看次数

Kotlin:内联lambda和重载分辨率模糊

我有一个简单的工厂模式,其中的实现是通过重载决定来确定的.问题是Kotlin编译器抱怨内联lambda的"Overload resolution ambiguity ..".

class Foo(){
    companion object Factory {
        fun create(x: Int, f: (Int) -> Double) = 2.0
        fun create(x: Int, f: (Int) -> Int) = 1
    }
}

fun main(args:Array<String>){
    val a =  Foo.create(1,::fromDouble) //OK
    val b =  Foo.create(1,::fromInt)  //OK
    val ambiguous =  Foo.create(1){i -> 1.0}  //Overload resolution ambiguity?
}


fun fromDouble(int:Int)  = 1.0
fun fromInt(int:Int)  = 1
Run Code Online (Sandbox Code Playgroud)

Kotlin编译器如何解决重载解析,为什么内联lambda被认为是不明确的?

lambda overload-resolution kotlin

10
推荐指数
1
解决办法
1071
查看次数

具有非空值的Kotlin Map

假设我有一张Map用于将扑克牌的字母翻译成整数

 val rank = mapOf("J" to 11, "Q" to 12, "K" to 13, "A" to 14)
Run Code Online (Sandbox Code Playgroud)

使用地图时,即使Map和Pair是不可变的,我也总是必须进行空安全检查:

val difference = rank["Q"]!! - rank["K"]!!
Run Code Online (Sandbox Code Playgroud)

我想这是因为泛型类型有Any吗?超类型.当Map和Pair都是不可变的时,为什么不能在编译时解决这个问题呢?

collections kotlin

10
推荐指数
3
解决办法
6430
查看次数

在Kotlin中使用autoclose

在stdlib/kotlin.io中我们找到了

inline fun <T : Closeable?, R> T.use(block: (T) -> R): R (source)
Run Code Online (Sandbox Code Playgroud)

但是它是在Closeable上实现的,而不是在Superinterface AutoCloseable上实现的.使用一些使用AutoCloseable的框架时,这可能有点痛苦.

为什么Kotlin不支持"使用"AutoCloseble?

kotlin

6
推荐指数
1
解决办法
752
查看次数

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
查看次数

Kotlin和详细的数组实例化

假设我有通过4个顶点的路径.在进行快速原型设计时,我会在java中定义它

double[][] path = {{1.0, 2.0}, {1.0,3.0}, {3.0,4.0}, {8.0,9.0}}
Run Code Online (Sandbox Code Playgroud)

使用arrayOf和doubleArrayOf函数,Kotlin中的代码相同

val path = arrayOf(doubleArrayOf(1.0, 2.0), doubleArrayOf(1.0, 2.0), doubleArrayOf(1.0,3.0), doubleArrayOf(8.0,9.0))
Run Code Online (Sandbox Code Playgroud)

感觉有点冗长.有没有Kotlin解决这个问题的方法?

编辑:用例是在数据数据的"REPL like"环境中回答查询,即思考Matlab或SciPy.

arrays syntax kotlin

5
推荐指数
2
解决办法
282
查看次数