如果我尝试访问泛型类型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,如果存在,我该如何访问它?
我有一个简单的工厂模式,其中的实现是通过重载决定来确定的.问题是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被认为是不明确的?
假设我有一张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都是不可变的时,为什么不能在编译时解决这个问题呢?
在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中创建一个非常简单的通用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区别对待吗?
假设我有通过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.
kotlin ×6
arrays ×2
generics ×2
collections ×1
lambda ×1
reflection ×1
syntax ×1
type-erasure ×1