2010-01-29 41 views
6

Tôi đã đoạn mã sau để xây dựng một bộ nhớ cache sử dụng google bộ sưu tập:Thực hiện một giao diện java trong Scala

val cache = new MapMaker().softValues().expiration(30, 
TimeUnit.DAYS).makeComputingMap(
    new com.google.common.base.Function[String,Int] { 
     def apply(key:String):Int ={ 
     1 
    } 
    }) 

Và Tôi nhận được thông báo lỗi sau:

error: type mismatch; 
found : java.lang.Object with 
com.google.common.base.Function[java.lang.String,Int]{ ... } 
required: com.google.common.base.Function[?, ?] 
    new com.google.common.base.Function[String,Int] { 
^

tôi tự hỏi tại sao loại nào không khớp?

Mã thực tế là:

import com.google.common.collect.MapMaker 
trait DataCache[V] { 
    private val cache = new MapMaker().softValues().makeComputingMap(
    new com.google.common.base.Function[String,V] { 
     def apply(key:String):V = null.asInstanceOf[V] 
    }) 
    def get(key:String):V = cache.get(key) 
} 

Kind regards, Ali

PS - Tôi đang sử dụng google-bộ sưu tập v1

Trả lời

7

Bạn cần cung cấp thông số loại cho cuộc gọi phương thức cuối cùng. Bạn đang đi qua giao diện kiểu thô và scala không thể tái tạo lại thông tin kiểu.

val cache = new MapMaker().softValues().expiration(30, 
TimeUnit.DAYS).makeComputingMap[String, Int](
    new com.google.common.base.Function[String,Int] { 
     def apply(key:String):Int ={ 
     1 
    } 
    }) 
1

Liệu các công trình sau đây?

new com.google.common.base.Function[_,_] { 

Nếu điều đó không làm việc, bạn có thể muốn giữ lại tờ khai vì nó là ngay bây giờ, và sau đó thêm một : com.google.common.base.Function[_, _] sau nó, như thế này:

val cache = new MapMaker().softValues().expiration(30, 
TimeUnit.DAYS).makeComputingMap(
    new com.google.common.base.Function[String,Int] { 
     def apply(key:String):Int ={ 
     1 
    } 
    }: com.google.common.base.Function[_, _]) 

Tôi đã nghe nói rằng một số Nội dung của Google sử dụng các loại thô, khá khó để tích hợp tốt với Scala. Và, trên thực tế, nên bị trục xuất trở lại địa ngục, họ đến từ đâu, nhưng đó chỉ là imho.

Ngoài ra, nếu bạn có thể biên dịch với -explaintypes, chúng tôi có thể có khái niệm tốt hơn về những gì không thành công.

+0

Không làm việc, bây giờ tôi nhận được lỗi này: lớp loại yêu cầu nhưng com.google.common.base.Function [_, _] tìm thấy com.google.common.base.Function mới [ _, _] Tôi cũng đã thử các biến thể, thực sự đầu ra thực sự khó hiểu: java.lang.Object với com.google.common.base.Function [_, _]

+0

@Ali: có vẻ như bạn chỉ thử đề xuất đầu tiên. Tôi đã dán mã đầy đủ cho đề xuất thứ hai ngay bây giờ. Ngoài ra, vui lòng thêm đầu ra của '-explaintypes' vào câu hỏi của bạn. –

+0

Trên thực tế đầu ra là khá lớn, tôi đã thêm mã thực tế mà người ta chỉ có thể sao chép dán để tạo lại thông báo lỗi. Xin vui lòng cho tôi biết nếu có bất cứ điều gì khác tôi sẽ cung cấp. –

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