2012-07-17 18 views
9

Seq [String] öğesinin tüm alt sınıflarının nesnelerini kabul eden bir yöntem yazdım. Maalesef, Array [String] türünde bir nesneyi kabul etmeyecektir. Array [String], Seq [String] bir alt sınıfı değil mi?Array [String] Scala'da bir Seq [String] alt sınıfı değil mi?

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(" ")) 

cevap

10

Hayır, Array[String] Eğer Java gördüklerin gibi, düzenli JVM diziler şöyle açıklanabilir: String[].

diğer Scala Seq koleksiyonları gördüğünüz Array[String] tüm işlemleri görülmesinin nedeni Array[T] den ArrayOps[T] bir implicit conversion olmasıdır.

yapın:

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

Bu bağlı bir görünümü denir. T'un Seq[String] alt tipi olması gerektiği veya T'u Seq[String]'a dönüştüren kapsam içinde örtük bir dönüşüm olması gerektiği anlamına gelir. Arka planda, derleyici aslında test örtülü bir parametre ekler, bu yöntem olur:

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

hemen yönteminin gövdesindeki Seq[String] için T örtük dönüşüm olarak hareket fonksiyonudur.

+2

görüntünün çalışmasını biraz açıklar ve bu cevap burada devam eden tüm önemli şeyleri açıklayacaktır. – sschaef

+0

Çok aydınlatıcı. Ben hala Scala’da yeniyim ve bakış açıları benim için yeni. Buna ben gireceğim. Hızlı cevabınız için teşekkürler. –

3

kaynakları (veya API docs) durumu, bu Array olan

final class Array[T] extends Serializable with Cloneable 

olarak tanımlanır, bu Seq bir alt tipi değildir. Bununla birlikte, dokümanlar ayrıca, örtülü bir dönüşüm olan WrappedArray'dan bahseder; burada bu öğe Seq'un bir alt kümesidir.