2014-07-23 13 views
5

tôi đã đưa ra phương pháp tĩnhScala chuyển đổi ngầm không nhận được áp dụng trên mô hình lập luận Java

static void foo(Object... params) 

trong lớp Java Bar và có kế hoạch để gọi nó như sau:

Bar.foo('x') 

mà sẽ không công việc beacause phương thức mong đợi một ký tự Java và bằng cách nào đó, chuyển đổi ngầm hiện tại không được áp dụng.

Bar.foo('x' : Character) 
Bar.foo(new Character('x')) 

cả hai sẽ thực hiện thủ thuật nhưng dễ bị tổn thương. Đưa những cấu trúc đó vào một chuyển đổi tiềm ẩn

implicit def baz(c : Char) = c : Character 

không hoạt động và tôi không hiểu tại sao. Vì vậy, câu hỏi của tôi: Vấn đề ở đây là gì? Có sửa chữa không?

+0

Với Scala 2.11.1 Tôi thấy thông báo lỗi sau: mario @ tumbolia/tmp/test 1024% scalac * Foo.scala: 2: lỗi: loại kết quả của chuyển đổi tiềm ẩn phải cụ thể hơn so với AnyRef Bar.foo ('x') ^ một lỗi được tìm thấy –

Trả lời

3

Trình biên dịch là rất cụ thể về việc tại sao nó sẽ không sử dụng bất kỳ các implicits:

error: the result type of an implicit conversion must be more specific than AnyRef 

Object là một từ đồng nghĩa với AnyRef, và becaue đó là giá trị nó cần phải gọi foo nó từ chối áp dụng bất kỳ chuyển đổi tiềm ẩn.

Tuy nhiên, bạn có thể định nghĩa một wrapper xung quanh Bar.foo để cho phép bạn sử dụng ký tự chữ:

def barFoo(chars: Character*) = Bar.foo(chars.toArray: _*) 
barFoo('x') 
+0

Lý do được nêu trong https://issues.scala-lang.org/browse/SI-6899 và cuộc trò chuyện được liên kết trên Google Groups (https : //groups.google.com/forum/? fromgroups = #! topic/scala-internals/cwEyQCmjX24) –

1

Các biến duy nhất có thể được đúc để một kiểu Object là những người đó là lớp ví dụ. Loại trừ loại cơ bản như int, boolean, double. Đây là một trong những cần phải được chuyển đổi, tương ứng với loại: Integer, Boolean, Double.

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