2009-12-10 21 views
6

Đoạn mã Scala sau không thể biên dịch trong Scala 2.7.7, với lỗi không khớp loại "tìm thấy: Null (null) bắt buộc: T" trên dòng cuối cùng :Lỗi không khớp loại Scala 2.7.x khi chuyển null cho kiểu tham chiếu

/** 
* @param [T] key type 
*/ 
class Key[T] 

class Entry[T](val k: Key[T], val v: T) 

def makeEntry[T <: AnyRef] = new Entry[T](new Key[T], null) 

tôi hoàn toàn nhận thức được sự tà ác của null, nhưng nó đủ để nói rằng tôi thực sự cần phải làm điều này. Đây có phải là lỗi trình biên dịch hoặc lỗi lập trình không?

Chỉnh sửa: Chỉ cần làm rõ, T là thông số kiểu và không phải là loại cụ thể. Tôi đã không nhận ra điều này là mơ hồ trong câu hỏi ban đầu cho đến khi tôi đọc phản ứng của Carl cẩn thận hơn.

+2

FYI: Mã này hoạt động trong 2,8 –

Trả lời

7

Rõ ràng correct way để làm điều này trong 2,7 là:

class Key[T] 

class Entry[T](val k: Key[T], val v: T) 

def makeEntry[T >: Null] = new Entry(new Key[T], null) 
1

Bạn đã thử điều này chưa?

def makeEntry[T <: AnyRef] = new Entry[T](new Key[T], null: T) 
+1

Cùng một vấn đề sử dụng REPL và scala 2.7.5. – paradigmatic

+0

Tôi không nhận ra đó là cú pháp hợp lệ. :) Chỉ cần thử nó, và nó không hoạt động. –

+0

Tôi không có 2,7 tiện dụng để kiểm tra, nhưng tôi cũng sẽ thử null.asInstanceOf [T] –

4

Đây là định nghĩa bao gồm null:

Loại Null là một subtype của tất cả các loại tài liệu tham khảo; ví dụ duy nhất của nó là tham chiếu null. Vì Null không phải là một kiểu con của kiểu giá trị, null không phải là thành viên của bất kỳ loại nào như vậy. Ví dụ, không thể gán null cho một biến kiểu Int.

Bằng tiếng Anh, điều này nói rằng bạn không thể chỉ định null cho loại giá trị nhưng nó hợp lệ để gán cho bất kỳ loại tham chiếu nào.

Tôi đang gặp một số sự cố khi tìm hiểu xem liệu T là giá trị hay loại tham chiếu; nhưng điều đó sẽ trả lời câu hỏi của bạn.

Khi bạn xác định T làm loại phụ của AnyRef, tôi đoán đó là ref và giải thích "lỗi" có vẻ có nhiều khả năng; đặc biệt là Mitch Blevins vừa nói mã hoạt động dưới 2,8.

+0

Có vẻ như sự đồng thuận rằng điều này sẽ hoạt động, vì vậy tôi sẽ chấp nhận câu trả lời của bạn trừ khi có bằng chứng trái ngược. –

2

Hãy thử điều này:

class Key[T <: AnyRef] 

class Entry[T <: AnyRef](val k: Key[T], val v: T) 

def makeEntry[T <: AnyRef] = new Entry[T](new Key[T], null.asInstanceOf[T]) 

Tôi không chắc chắn lý do tại sao "asInstanceOf [T]" là cần thiết, nhưng nó có vẻ là.

+0

Không hoạt động ở Scala (và tôi thực sự không thể sử dụng kỹ thuật đó vì Khóa và Nhập thực sự là các lớp Java được định nghĩa trong một thư viện khác) –

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