Kotlin 可迭代

标签 kotlin spotbugs

鉴于此类:

data class CSVRecord(private val columns: SortedSet<CSVColumn>) : Iterable<String> {

    override fun iterator(): Iterator<String> {
        return columns.map { it.value }.iterator()
    }
}

spotbugs 引发错误:

[ERROR] Questionable cast from Collection to abstract class java.util.List in com.example.CSVRecord.iterator() [com.example.CSVRecord] At CSVRecord.kt:[line 15] BC_BAD_CAST_TO_ABSTRACT_COLLECTION

这只是因为 Spotbugs 不支持 Kotlin,还是我的实现可能无效?

最佳答案

FindBugs 处理字节码,然后反向查找文件和行信息。 Kotlin 编译器很可能发出了一条 CHECKCAST 指令,从 Kotlin 的角度来看,很明显强制转换会通过,但 Java 方法的返回类型声明或声明的局部变量/参数类型,范围更广。

这是我从 IDEA 获得的函数的反编译 Kotlin 字节码:

@NotNull
public Iterator iterator() {
    Iterable $receiver$iv = (Iterable)this.columns;
    Collection destination$iv$iv = (Collection)
            (new ArrayList(collectionSizeOrDefault($receiver$iv, 10)));
    Iterator var4 = $receiver$iv.iterator();

    while(var4.hasNext()) {
        Object item$iv$iv = var4.next();
        CSVColumn it = (CSVColumn)item$iv$iv;
        String var11 = it.getValue();
        destination$iv$iv.add(var11);
    }

    return ((List)destination$iv$iv).iterator();
}

您可以看到声明inline fun map 在这个级别上的含义:它的整个代码成为您方法实现的一部分。发出的字节码恰好使用 Collection 类型变量 destination$iv$iv 来保存对 ArrayList 的引用。 return 语句将其转换为 List,这是完全允许的,而且显然是安全的。

关于Kotlin 可迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50452049/

相关文章:

android - 如何在 sdk 28 上获取 Wi-FI 状态(开/关)

Java/SpotBugs,如果在接口(interface)中声明 "named static inner class",那么它是什么?

java - 如何通过 Maven 运行 Spotbugs?

android - 如何在Android中使用界面

android - 绑定(bind)服务崩溃并出现 "Context.startForegroundService() did not then call Service.startForeground()"错误

java - 如何找到不再需要的@SuppressFBWarnings 注释?

java - FindBugs插件Eclipse发现的错误

java - SpotBugs "No value has been specified for property ' SpotbugsClasspath'"

android - 密封类在 Android 环境中的性能影响是什么?

spring-boot - 在 @ComponentScan 中使用多个路径不起作用