tôi đang cố gắng để tạo ra một chuyển đổi ngầm từ bất kỳ loại (nói, Int) vào một String ...Tránh ngầm def nhập nhằng trong Scala
Một chuyển đổi ngầm để String là các phương thức RichString (như ngược lại) không có sẵn .
implicit def intToString(i: Int) = String.valueOf(i)
100.toCharArray // => Array[Char] = Array(1, 0, 0)
100.reverse // => error: value reverse is not a member of Int
100.length // => 3
Một chuyển đổi ngầm để RichString nghĩa phương pháp String (như toCharArray) không có sẵn
implicit def intToRichString(i: Int) = new RichString(String.valueOf(i))
100.reverse // => "001"
100.toCharArray // => error: value toCharArray is not a member of Int
100.length // => 3
Sử dụng cả hai chuyển đổi tiềm ẩn là các phương thức trùng lặp (như chiều dài) là mơ hồ.
implicit def intToString(i: Int) = String.valueOf(i)
implicit def intToRichString(i: Int) = new RichString(String.valueOf(i))
100.toCharArray // => Array[Char] = Array(1, 0, 0)
100.reverse // => "001"
100.length // => both method intToString in object $iw of type
// (Int)java.lang.String and method intToRichString in object
// $iw of type (Int)scala.runtime.RichString are possible
// conversion functions from Int to ?{val length: ?}
Vì vậy, có thể chuyển đổi hoàn toàn thành chuỗi và vẫn hỗ trợ tất cả các phương thức String và RichString không?
Có vẻ như 'hút nó lên' là lựa chọn tốt nhất. Thiết kế API trong Scala là khó khăn hơn đáng kể so với việc là một người tiêu dùng API. Tôi muốn tạo một kiểu dữ liệu bao bọc một giá trị và cho phép người dùng API xử lý kiểu dữ liệu như thể nó là kiểu giá trị tập trung. Ví dụ. nếu nó kết thúc tốt đẹp một Int, sau đó đối xử với đối tượng như một int. Hóa ra điều này là quá khó. tôi đang xem xét đưa ra phương pháp datatype helper của tôi: loại T val internedValue: T def s = internedValue.asInstanceOf [Chuỗi] def i = internedValue.asInstanceOf [Int] ... vv – Synesso
thích '(100: String) .length', vì đây là kiểu an toàn, trong khi 'asInstanceOf' thì không. Bên cạnh đó, nó đẹp hơn và ngắn hơn. –
Không chỉ vậy, nhưng asInstanceOf sẽ không bao giờ làm việc ở đây, vì nó chỉ bao giờ downcasting (mà là ràng buộc để thất bại ở đây) và sẽ không bắt đầu bất kỳ chuyển đổi tiềm ẩn. Nói cách khác '100.asInstanceOf [String] .length' sẽ luôn thất bại với' ClassCastException' –