给定此类:
data class CSVRecord(private val columns: SortedSet<CSVColumn>) : Iterable<String> {
override fun iterator(): Iterator<String> {
return columns.map { it.value }.iterator()
}
}
Run Code Online (Sandbox Code Playgroud)
spotbugs引发错误:
[错误]从Collection到com.example.CSVRecord.iterator()中抽象类java.util.List的可疑转换。[com.example.CSVRecord]在CSVRecord.kt:[第15行] BC_BAD_CAST_TO_ABSTRACT_COLLECTION
这仅仅是因为Spotbugs不支持Kotlin,还是我的实现可能无效?
FindBugs处理字节码,然后反向查找文件和行信息。CHECKCAST
从Kotlin的角度来看,似乎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();
}
Run Code Online (Sandbox Code Playgroud)
您可以inline fun map
在该级别上看到声明的含义:声明的整个代码成为方法实现的一部分。发出的字节码碰巧使用了一个Collection
类型变量destination$iv$iv
来保存对的引用ArrayList
。该return
语句将其强制转换为List
,这是完全允许的,并且显然是安全的。
归档时间: |
|
查看次数: |
557 次 |
最近记录: |