2011-09-28 24 views
5

Tôi có một đối tượng Java OldFashioned mở rộng Java 1.4 List:Cách thêm đối tượng vào Danh sách Java không tham số?

[Java] 
class OldFashioned extends List { ... } 

Đó là, OldFashioned không mất bất kỳ thông số kiểu. Tôi cần thêm SomeObject vào nó. Trong Java không có vấn đề gì, vì nó xử lý List 1.4 là List<Object> 1.5 và cho phép thêm bất kỳ lớp con nào của Object vào bộ sưu tập. Nhưng Scala thì không. Vì vậy, mã tiếp theo không hoạt động:

[Scala] 
val oldFashioned = new OldFashioned() 
oldFashioned.add(new SomeObject)  // found: SomeObject; required: E 

Đó là, Scala biên dịch đòi hỏi để vượt qua các tham số kiểu để OldFashioned mà thực sự không đưa họ:

[Scala] 
var oldFashioned: OldFashioned[SomeObject] = null // OldFashioned does not take type parameters 

Làm thế nào tôi có thể vượt qua nó và thêm SomeObject đến OldFashined?

Trả lời

8

Ok, tôi không thể tin rằng một trong những earlier question tôi tìm thấy một sử dụng ở đây (bạn nên đi upvote agilesteel của answer)

def add(oldFashioned: OldFashioned, any: Any): Boolean = oldFashioned match { 
    case l: java.util.List[a] => l.add(any.asInstanceOf[a]) 
} 

val oldFashioned = new OldFashioned 
// oldFashioned: OldFashioned = [] 

add(oldFashioned, "test") 
// res0: Boolean = true 
add(oldFashioned, 1) 
// res1: Boolean = true 
add(oldFashioned, new Object) 
// res2: Boolean = true 

oldFashioned 
// res3: OldFashioned = [test, 1, [email protected]] 

Edit: Tôi đoán chừng nào tôi sẽ đúc:

oldFashioned.asInstanceOf[java.util.List[SomeObject]].add(new SomeObject) 
+0

Funnily, IDEA nêu bật '[a]' là lỗi, nhưng trình biên dịch Scala không khiếu nại, vì vậy nó hoạt động. Upvotes cho cả hai câu trả lời của bạn và agilesteel của. Cảm ơn! – ffriend

+0

Tôi đã bắt đầu tự hỏi, tại sao một trong những câu trả lời cũ của tôi đã nhận được một vài upvotes đột ngột;) Cảm ơn ngay tại bạn! – agilesteel

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