tôi đã gặp khó khăn tìm hiểu lý do tại sao một Java HashMap
không tương thích với một Java Map
trong Kotlin:Có java.util.HashMap không triển khai java.util.Map trong Kotlin không?
val map : java.util.Map<Int, Int> = java.util.HashMap<Int, Int>()
// ERROR: Type mismatch
Đây có phải là một lỗi hay là nó cố ý thi hành là một lỗi trong Kotlin?
Đây là ví dụ thứ hai với trình biên dịch Java tới Kotlin. Hãy xem này Java dụ file:
public class Test {
public static void main(String[] args) {
java.util.Map<Integer, Integer> map = new java.util.HashMap<>();
insertValue(map);
}
private static void insertValue(java.util.Map<Integer, Integer> map) {
map.putIfAbsent(0, 1);
}
}
Chạy "Convert Java để Kotlin" Kết quả trong tập tin này:
object Test {
@JvmStatic fun main(args: Array<String>) {
val map = java.util.HashMap<Int, Int>()
insertValue(map)
}
private fun insertValue(map: Map<Int, Int>) {
map.putIfAbsent(0, 1) // ERROR! Unresolved reference
}
}
Nếu tôi cố gắng sửa đổi nó để phản ánh nhiều tập tin gốc, nơi insertValue
dự kiến một Java java.util.Map
, tôi gặp phải một lỗi khác:
object Test {
@JvmStatic fun main(args: Array<String>) {
val map = java.util.HashMap<Int, Int>()
insertValue(map) // ERROR: Type mismatch
}
private fun insertValue(map: java.util.Map<Int, Int>) {
map.putIfAbsent(0, 1) // is now OK
}
}
Bạn có chắc chắn không? Tôi nghĩ rằng 'kotlin.MutableMap' không tồn tại trong thời gian chạy? – voddan
Chính xác. Đó là lý do tại sao tôi đã viết "tại thời gian biên dịch" trong câu trả lời của tôi. [Các loại ánh xạ] của Kotlin (https://kotlinlang.org/docs/reference/java-interop.html#mapped-types) có sẵn tại thời gian biên dịch nhưng sau đó ánh xạ tới các kiểu khác nhau khi chạy. Thêm chi tiết về các loại nền tảng [tại đây] (https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types) và [tại đây] (https://kotlinlang.org/ tài liệu/tham chiếu/java-interop.html # loại chú thích cho nền tảng). – mfulton26