通过变量的传递类型

时间:2020-04-18 17:28:17

标签: kotlin

我想使用外部库中的方法加载我的资产文件,并声明该功能:

inline fun <reified T> loadSync(path: String): T = loadSync(getAssetDescriptor(path))

而且我想让枚举存储我所有的资产路径和类型,目前看起来像这样:

enum class Asset (val path: String, val clazz: Class<*>){
    // Textures
    LOADER("splash-screen/loader.png", Texture::class.java),
    // ...
}

如果能够做出类似的事情,那将很棒

assetStorage.loadSync<Asset.LOADER.clazz>(Asset.LOADER.path)

但是我不知道如何正确声明clazz

1 个答案:

答案 0 :(得分:0)

您不能对通用类型参数使用Asset.LOADER.clazz之类的表达式。您要么必须将类型提供为

assetStorage.loadSync<Texture>(Asset.LOADER.path)

或者必须围绕将类作为参数传递的loadSync函数创建包装函数,以便编译器可以如下推断类型

@Suppress("UNUSED_PARAMETER")
inline fun <reified T> newLoadSync(path: String, clazz: T): String = loadSync<T>(path)

并将其用作

assetStorage.newLoadSync(Asset.LOADER.path, Asset.LOADER.clazz)