kısa sürümü (eğer örneğini olamayacağını) yapısal bir türü için bir tür takma oluşturduk olmasıdır.
scala> import collection.mutable._
import collection.mutable._
scala> type ObservableHashSet[T] = HashSet[T] with ObservableSet[T]
defined type alias ObservableHashSet
scala> new ObservableHashSet[String]
<console>:12: error: class type required but scala.collection.mutable.HashSet[String] with scala.collection.mutable.ObservableSet[String] found new ObservableHashSet[String]
Şimdi, hata bazı mantıklı geliyor ve bana açıklamaya çalışalım:
Bu yaptığına basitleştirilmiş bir versiyonudur (çalışmıyor).
type ObservableHashSet[T] = HashSet[T] with ObservableSet[T]
ile, somut olmayan (örneğin, "sınıf türü" değil, hata mesajında olduğu gibi) bir tür takma ad tanımlıyorsunuz, böylece new
ile bunun bir örneğini oluşturamazsınız .
Ama bu (biz bir sınıf türünü oluşturmak yapmak bir ara adım ile)
çalışır:
scala> class ObservableHashSet[T] extends HashSet[T] with ObservableSet[T]
defined class ObservableHashSet
scala> type obs[T] = ObservableHashSet[T]
defined type alias obs
scala> new obs[String]
res1: ObservableHashSet[String] = Set()
Soru şu: neden scala size başlatamazsınız bir tip takma adı oluşturun geliyor? Eh, type ObservableHashSet[T] = HashSet[T] with ObservableSet[T]
yapısal bir türüdür. Kodun ilk kod parçasında gördüğünüz gibi, bunun bir örneğini oluşturamazsınız, yine de kullanabilirsiniz: ör. Bir fonksiyonun argümanı üzerine yapısal bir kısıtlama koymak.
scala> type ObservableHashSet[T] = HashSet[T] with ObservableSet[T]
defined type alias ObservableHashSet
scala> def test(obsHashSet: ObservableHashSet[String]) : String = {"bingo!"}
test: (obsHashSet: ObservableHashSet[String])String
scala> test(new HashSet[String] with ObservableSet[String])
res4: String = bingo!
ama biz bir tür uyuşmazlığı almak yapısal tipe uygun olmayan bir argümanla testi aramayı deneyin eğer:
bir göz atın
scala> test(new HashSet[String])
<console>:13: error: type mismatch;
found : scala.collection.mutable.HashSet[String]
required: ObservableHashSet[String]
Teşekkür Paulo. Sanırım bir çeşit makro ikame olarak "tip" düşünmekteydim. Yapısal tipler üzerinde biraz daha okuyacağım. thx – Richard
@Richard: soru için teşekkürler. Cevabı bilmedim ve sormadan önce "tip" ile deney yapmanın öğreticiydi. –