xem xét lớp học này với hai chức năng, một với Int
luận, khác với chung một:Làm thế nào để đối phó với một độ phân giải quá tải độ phân giải của các chức năng với generics?
class C<K, V> {
// ...
operator fun f(index: Int): Pair<K, V> = ...
operator fun f(key: K): V = ...
}
Khi nó là tham số như C<Int, SomeType>
, K
là Int
, và cả hai chức năng phù hợp với các cuộc gọi, kết quả vào một lỗi :
val m = C<Int, SomeType>()
m.f(1)
Overload resolution ambiguity. All these functions match:
public final fun f(index: Int): SomeType
defined inC
public final fun f(key: Int): Pair<Int, SomeType>?
defined inC
làm thế nào để gọi bất cứ f
tôi muốn trong trường hợp này?
Đó là sự thật, nhưng điều đó đòi hỏi một số suy nghĩ trước để thiết kế lớp 'C' ngăn chặn xung đột chữ ký có thể với Generics thay thế. Và nếu bạn phải đối mặt với lớp học như vậy và không có cách nào để đổi tên các chức năng của nó, bạn phải sử dụng các thủ thuật chung từ câu trả lời của @ hotkey. – Ilya