Kotlin 可迭代
Kotlin iterable
鉴于此 class:
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 方法的 return 类型声明,或声明的本地 variable/parameter 类型更广泛。
这是我从 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
,这是完全允许的,而且显然是安全的。
鉴于此 class:
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 方法的 return 类型声明,或声明的本地 variable/parameter 类型更广泛。
这是我从 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
,这是完全允许的,而且显然是安全的。