1

尝试调用期望 aClass作为参数的现有 Java 代码,我在 Kotlin 中尝试了以下代码:

package com.example

//Acutally imported Java code in someone elses's library
abstract class JavaCode<T> {
    fun doTheThing(thing: Class<JavaCode<T>>) {
        //Does work
    }
}

//My code
class KotlinCode : JavaCode<String>() {
    fun startTheThing() {
        doTheThing(KotlinCode::class.java)
    }                             // ^ Type inference failed. Expected type mismatch
}

但这不会编译并出现以下错误:

Type inference failed. Expected type mismatch: inferred type is Class<KotlinCode> but Class<JavaCode<String>> was expected

所以我试图强制强制转换(如this answer中所建议):

hello(GenericArgument::class.java as Class<Callable<String>>)

但这有一个警告:

Unchecked cast: Class<KotlinCode> to Class<JavaCode<String>>

那么正确的语法是什么?这有关系吗?

4

1 回答 1

0

您的代码中有几个问题。

首先,Callable<String?>不等于Callable<String>Callable<String?>表示论点可以是StringnullCallable<String>只是String

Class<GenericArgument>是不执行Class<Callable<String>>GenericArgument执行Callable<String>。它们是不同的。您可以将其更改为使用泛型。

private fun <T : Callable<String>> hello(callable: Class<T>) {
    System.out.println(callable.toString())
}

现在,泛型参数由Callable<String>.

第三,callable.toString()可能没有做你想做的事。callable.toString() 将调用toString()类而不是对象,例如class com.example.yourclass. 如果要调用对象toString()。这是正确的。

override fun call(): String {
    hello(GenericArgument())
    return "value"
}

private fun <T : Callable<String>> hello(callable: T) {
    System.out.println(callable.toString())
}

此外,Kotlin 允许将函数作为参数传递或使用 SAM 作为接口。Callable不需要实施 for 。

编辑:随着操作更新问题。

@Suppress("UNCHECKED_CAST")
fun <T, U : JavaCode<T>> JavaCode<T>.doTheThing2(thing: Class<U>) {
    doTheThing(thing as Class<JavaCode<T>>)
}
于 2017-09-18T03:27:42.183 回答