2012-06-13 27 views
7

Tôi có một số mã Scala sử dụng các loại hiện có mà tôi đang nâng cấp lên 2,10 và tôi nhận thấy cảnh báo về việc thêm "import language.existentials" khiến tôi nghĩ nên có cách viết tốt hơn điều này. Mã Tôi có nắm tới:Thay thế thành ngữ cho các loại tồn tại

class A { 
    private var values = Set.empty[(Class[_], String)] 
    def add(klass: Class[_], id: String) { 
    val key = (klass, id) 
    if (!values(key)) { 
     values += key 
     // More logic below.. 
    } 
    } 

tôi nhận được cảnh báo này:

[warn] test.scala:4 inferred existential type (Class[_$2], String) forSome { type _$2 }, which cannot be expressed by wildcards, should be enabled 
[warn] by making the implicit value language.existentials visible. 
[warn] This can be achieved by adding the import clause 'import language.existentials' 
[warn] or by setting the compiler option -language:existentials. 
[warn] See the Scala docs for value scala.language.existentials for a discussion 
[warn] why the feature should be explicitly enabled. 
[warn]  val key = (klass, id) 

Có cách nào tôi có thể viết lại mã của tôi không tạo ra cảnh báo này (hoặc yêu cầu nhập khẩu), hoặc là cách thành ngữ nhất để thể hiện nó là gì? Tôi không bao giờ hỏi về tham số kiểu của Class ở bất kỳ đâu trong mã.

Trả lời

8

Cảnh báo là về suy luận kiểu tồn tại, thường không mong muốn. Thêm tuyên bố nhập hoặc làm rõ tuyên bố nhập:

val key: (Class[_], String) = (klass, id) 
+0

xin lỗi, tôi không hiểu điểm. Tại sao loại suy đoán nguy hiểm hoặc không mong muốn? Tham số trên Class không quan trọng, nó hầu như không bao giờ thực hiện khi bạn phải đối phó với các lớp và sự phản chiếu (vì nó bị xóa và do đó vô giá trị tại thời điểm bạn buộc phải kiểm tra hoặc sử dụng thông tin lớp). Tại sao chúng ta buộc phải viết một tuyên bố kiểu thừa cho một cái gì đó rõ ràng và đơn giản như là chìa khóa trong trường hợp này. Có * là * một loại khai báo một dòng ở trên, vậy đâu là vấn đề? – Ichthyo

+0

hãy để tôi làm rõ: Tôi biết rằng bạn có thể xây dựng các công cụ rất phức tạp và khó hiểu với cú pháp đầy đủ cho các loại tồn tại. Nhưng trong trường hợp này ở đây, đâu là vấn đề hay nguy hiểm? 'Lớp [_]' có vẻ đầy đủ – Ichthyo

+0

@ Ichthyo có thể đúng với Lớp, nhưng một Danh sách tồn tại không gần như hữu ích, ví dụ. Tham số kiểu trên Class hầu hết là vô ích, đó là lý do tại sao sự tồn tại với nó không phải là một vấn đề lớn. –

4

Nếu bạn cung cấp thông số loại cho phương thức thêm, cảnh báo sẽ biến mất. Điều này không ảnh hưởng đến những gì có thể được lưu trữ trong các giá trị var. Tôi không có một câu trả lời tốt là tại sao nhưng đó là một cách giải quyết. Hy vọng rằng một người nào đó có thể cũng sẽ trả lời với một lời giải thích.

class A { 
    private var values = Set.empty[(Class[_], String)] 

    def add[T](klass: Class[T], id: String) { 
     val key = (klass, id) 
     if (!values(key)) { 
     values += key 
     // More logic below.. 
     } 
    } 
    } 
Các vấn đề liên quan