2009-03-19 16 views
16

Trong Java tôi có thể làm điều này:ký tự đại diện Generic trong khai báo biến trong Scala

class MyClass { 
    private List<? extends MyInterface> list; 

    public void setList(List<MyImpl> l) { list = l; } 
} 

... giả định rằng (MyImpl implements MyInterface) tất nhiên.

Tương tự cho điều này trong Scala, khi sử dụng Buffer là gì?

import java.lang.reflect._ 
import scala.collection.mutable._ 

class ScalaClass { 
    val list:Buffer[MyInterface] = null 

    def setList(l: Buffer[MyImpl]) = { 
    list = l 
    } 
} 

Điều này (tất nhiên) không biên dịch - nhưng làm cách nào để khai báo biến số list theo cách như vậy?

EDIT; Tôi đang thêm một chút nữa. Sự khác biệt rõ ràng là một cái gì đó để làm với thực tế là trong Java, generics là không bao giờ covariant trong T, trong khi ở Scala họ có thể hoặc là covariant hay không. Ví dụ, lớp Scala List là biến thể trong T (và nhất thiết là không thay đổi). Vì vậy sau sẽ biên dịch:

class ScalaClass { 
    val list:List[MyInterface] = null 

    def setList(l: List[MyImpl]) = { 
    list = l 
    } 
} 

Tôi vẫn đang phải vật lộn một chút với lỗi biên dịch:

Covariant type T occurs in contravariant position in ...

Ví dụ; lỗi biên dịch này xảy ra trong khai báo lớp:

class Wibble[+T] { 
    var some: T = _ //COMPILER ERROR HERE! 
} 

Tôi sẽ đặt một câu hỏi riêng biệt ...

+0

Câu hỏi này đã được trả lời hay vẫn còn mở? –

+0

Tôi đã không nhận thấy câu trả lời của bạn khi tôi đi nghỉ mát ngay sau đó. Lấy làm tiếc. Tôi khá chắc chắn rằng tôi đã đọc rằng đã có "không có ký tự đại diện trong Scala". Đây có phải là trường hợp không? Tôi cho rằng nó không phải bây giờ ... –

Trả lời

41

Các analog trực tiếp đến

import java.util.List; 
List<? extends MyInterface> list; 

import java.util.List 
var list : List[_ <: MyInterface] = _; 

Tương tự đối phó với Buffer

Để trả lời nhận xét của bạn earler, trong các tham số kiểu Java luôn bất biến, không phải hiệp biến.

-1

Tôi không chắc ở tất cả Tôi hiểu câu hỏi của bạn (có thể là không đủ cà phê của tôi một phần) nhưng có vẻ như bạn đang hỏi về generic classes. Nếu không, hãy viết nhận xét hoặc thêm thông tin khác vào câu hỏi của bạn & Tôi sẽ kiểm tra lại sau & chỉnh sửa câu trả lời của tôi.

+0

Tôi nghĩ rằng tôi hiểu thêm một chút về nó ngay bây giờ; sự khác biệt giữa scala.List và scala.collection.Buffer là List là covariant trong kiểu của nó trong khi Buffer thì không. Trong Java, generics là * luôn luôn * covariant trong T –

+2

Câu hỏi này phải là một chú thích. Tôi đã không bầu bạn xuống. – Adrian

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