Kotlin Poet 模糊导入

问题描述 投票:0回答:1

假设我在一个项目中有两个接口:

interface InterfaceA {
    // ...
    interface Listener {
        // ...
    }
}

interface InterfaceB {
    // ...
    interface Listener {
        // ...
    }
}

并且我使用 Kotlin Poet 的

ClassName
来声明它们及其侦听器进行注释处理,例如。

fun InterfaceA() = ClassName(
    packageName = "com.example.a",
    simpleNames = arrayOf("InterfaceA"),
)

fun InterfaceAListener() = ClassName(
    packageName = "com.example.a.InterfaceA",
    simpleNames = arrayOf("Listener"),
)

fun InterfaceB() = ClassName(
    packageName = "com.example.b",
    simpleNames = arrayOf("InterfaceB"),
)

fun InterfaceBListener() = ClassName(
    packageName = "com.example.b.InterfaceB",
    simpleNames = arrayOf("Listener"),
)

我必须生成的类使用所有上述类型:

InterfaceA
InterfaceA.Listener
InterfaceB
InterfaceB.Listener
。这会导致生成以下导入,并由于模糊的
Listener
导入而产生编译错误。

import com.example.a.InterfaceA
import com.example.a.InterfaceA.Listener
import com.example.b.InterfaceB
import com.example.b.InterfaceB.Listener

有什么方法可以摆脱监听器导入,因为它们并不是真正必要的?或者还有其他方法可以解决这个问题吗?

感谢您的帮助!

kotlin annotation-processing kotlinpoet
1个回答
2
投票

Listener
实际上并不位于名为
com.example.a.InterfaceA
com.example.a.InterfaceB
的包中。它们是 InterfaceA
InterfaceB
中的
嵌套
类型。

您可以使用

ClassName
方法创建表示嵌套类型的
nestedClass

示例:

val listenerA = ClassName("com.example", "InterfaceA").nestedClass("Listener")
val listenerB = ClassName("com.example", "InterfaceB").nestedClass("Listener")
FileSpec.builder("", "Foo")
    .addProperty(
        PropertySpec.builder("foo", listenerA).build()
    )
    .addProperty(
        PropertySpec.builder("bar", listenerB).build()
    )
    .build()
    .writeTo(System.out)

输出:

import com.example.InterfaceA
import com.example.InterfaceB

public val foo: InterfaceA.Listener

public val bar: InterfaceB.Listener

请注意,仅导入

InterfaceA
InterfaceB


即使

Listener
不是嵌套类型,并且实际上是不同包中的顶级接口。 KotlinPoet 仍然可以通过使用别名导入来解决冲突。

也就是说,如果您确实这样做了:

val listenerA = ClassName("com.example.InterfaceA", "Listener")
val listenerB = ClassName("com.example.InterfaceB", "Listener")

KotlinPoet 会生成:

import com.example.InterfaceA.Listener as InterfaceAListener
import com.example.InterfaceB.Listener as InterfaceBListener
© www.soinside.com 2019 - 2024. All rights reserved.