2015-12-13 14 views
13

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 
    } 
} 

Trả lời

13

Trong Kotlin, java.util.HashMap, tại thời gian biên dịch, không triển khai java.util.Map, nhưng triển khai kotlin.collections.MutableMap mở rộng chỉ đọc kotlin.collections.Map.

Điều này là do số mapped types của Kotlin. Xem Bộ sưu tập trong Kotlin M3 is Out! để biết thêm chi tiết.

MutableMap không xác định bất kỳ putIfAbsent nào nhưng có chức năng mở rộng getOrPut.

+1

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

+0

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

0

Tôi nghĩ, đó là lỗi. Bạn có thể báo cáo tại đó https://youtrack.jetbrains.com/issues/KT

Nhưng vẫn còn, putIfAbsent là tính năng Java 8, chưa được hỗ trợ trong giao diện Kotlin (MutableMap thiếu phương pháp này).

+0

Tại sao lại bỏ phiếu? –

+1

Tôi nghi ngờ các phiếu giảm giá là do thiếu tài liệu tham khảo sao lưu câu trả lời này. ví dụ. Câu trả lời này có thể được coi là hữu ích hơn nếu một số liên kết đến một vấn đề hoặc tài liệu liên quan về [gọi Java từ Kotlin] (https://kotlinlang.org/docs/reference/java-interop.html) được cung cấp trong đó tiểu bang/cho thấy rằng Bộ sưu tập Java không được xử lý đặc biệt trong Kotlin. – mfulton26

+0

Cá nhân tôi đánh giá cao câu trả lời nhưng tôi muốn nó tham chiếu một vấn đề cụ thể hoặc một số tài liệu hỗ trợ rằng nó có thể là một lỗi. – mfulton26

3

Tôi tạo ra một báo cáo lỗi, chủ yếu cho các "Java để Kotlin" chuyển đổi mà tạo ra mã Kotlin không hợp lệ trong ví dụ ban đầu của tôi:

KT-10400 Java to Kotlin converter: converting Java Code where a java.util.HashMap is accessed through the java.util.Map interface fails

Tôi cũng nói rằng java.util.HashMap không thực hiện java.util.Map nhưng tôi rời nó cho các nhà phát triển Kotlin quyết định xem đó có phải là lỗi hay liệu trình biên dịch có đúng là từ chối nó hay không.

CẬP NHẬT: Lỗi được đánh dấu là đã giải quyết (cam kết 5e231db6).

Các vấn đề liên quan