2012-07-17 35 views
9

Tôi đã viết một phương thức chấp nhận các đối tượng của tất cả các lớp con của Seq [String]. Thật không may nó sẽ không chấp nhận một đối tượng kiểu Array [String]. Là mảng [String] không phải là một phân lớp của Seq [String]?Là mảng [String] không phải là một phân lớp của Seq [String] trong Scala?

scala> def test[T <: Seq[String]](x: T) = {} 
test: [T <: Seq[String]](x: T)Unit 

scala> val data = "This is a test string" 
data: java.lang.String = This is a test string 

scala> test(data.split(" ")) 
<console>:10: error: inferred type arguments [Array[java.lang.String]] do not conform to method test's type parameter bounds [T <: Seq[String]] 
       test(data.split(" ")) 

Trả lời

10

Không, Array[String] dịch để mảng JVM thông thường, như những người bạn nhìn thấy trong Java: String[].

Lý do tại sao bạn thấy tất cả các hoạt động trên Array[String] mà bạn thấy trên Scala Seq bộ sưu tập khác là có một implicit conversion từ Array[T] để ArrayOps[T].

Làm điều này:

def test[T <% Seq[String]](x: T) = {} 

này được gọi là một cái nhìn ràng buộc. Điều này có nghĩa là T phải là một loại phụ của Seq[String] hoặc sẽ tồn tại một chuyển đổi tiềm ẩn trong phạm vi chuyển đổi T thành một Seq[String]. Đằng sau hậu trường, trình biên dịch thực sự thêm một tham số ngầm để test, vì vậy phương pháp này trở thành:

scala> def test[T <% Seq[String]](x: T) = {} 
test: [T](x: T)(implicit evidence$1: T => Seq[String])Unit 

implicit evidence$1 Đây là chức năng mà hiện nay đóng vai trò như việc chuyển đổi ngầm T-Seq[String] trong cơ thể của phương pháp.

+2

giải thích công việc của chế độ xem bị ràng buộc một chút và câu trả lời này sẽ giải thích tất cả những điều quan trọng đang diễn ra tại đây. – sschaef

+0

Rất khai sáng. Tôi vẫn còn mới để Scala và xem giới hạn là mới với tôi. Tôi sẽ đi vào đó. Cảm ơn bạn đã trả lời nhanh chóng của bạn. –

3

Các nguồn (hoặc API docs) nhà nước, mà Array được định nghĩa là

final class Array[T] extends Serializable with Cloneable 

Nghĩa là, nó không phải là một subtype của Seq. Tuy nhiên, các tài liệu cũng đề cập đến một chuyển đổi tiềm ẩn WrappedArray, trong đó tài liệu sau là một tập con của Seq.

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