2010-05-19 39 views
12

Trong đoạn Groovy sau, tôi cố gắng để thay thế cả hai phương pháp hashCodetoStringthay thế toString sử dụng Groovy Lập trình meta

String.metaClass.toString = {-> "override" } 
String.metaClass.hashCode = {-> 22 } 

Nhưng khi tôi kiểm tra nó ra, chỉ việc thay thế hashCode làm việc

String s = "foo" 
println s.hashCode() // prints 22 
println s.toString() // prints "foo" 

Có phải toString bằng cách nào đó là trường hợp đặc biệt (có thể vì lý do bảo mật)?

Trả lời

5

Xem nhận xét đầu tiên on this issue. Nó nói về toString Chuỗi và lớp Chuỗi liên quan khác:

(...) có vẻ là ý định, nó có lẽ là một ý tưởng tốt để có một gọi nhanh cho các lớp học không cho phép trọng toString().

+0

Làm thế nào để bạn biết "các lớp không cho phép ghi đè toString()" là gì? –

+0

Tôi đăng một vấn đề mới mà hy vọng sẽ xóa mọi thứ ... http://jira.codehaus.org/browse/GROOVY-4210 –

+0

Cảm ơn Tim, vì vậy tôi đoán câu trả lời ngắn gọn là "đó là lỗi"? –

1

Đây là know defect. Về cơ bản Groovy không ghi đè chính xác các phương thức là một phần của việc triển khai giao diện.

này hoạt động:

class T { 
     def doIt() { true } 
} 

def t = new T() 

assert t.doIt() 
t.metaClass.doIt = { -> false } 
assert !t.doIt() 

này không:

interface I { 
     def doIt() 
} 

class T implements I { 
     def doIt() { true } 
} 

def t = new T() 

assert t.doIt() 
t.metaClass.doIt = { -> false } 
assert !t.doIt() 

toString() trong String đến từ CharSequence cách chính xác để ghi đè lên sẽ là:

CharSequence.metaClass.toString = {-> "silly"} 
println "hello world".toString() 
Các vấn đề liên quan