2011-11-07 10 views
11

'u HashSet ile karıştırarak yeni bir tür oluşturduktan sonra, yeni bir tür oluşturmak için yeni türü kullanabilmeyi beklerdim. Aşağıdaki "foo" daki gibi. Ancak bu, orijinal uzun formunu kullanmanın iyi görünmesine rağmen (aşağıdaki "bar" da gösterildiği gibi) derleme yapmaz.Tür takma adının oluşturulması "sınıf türü gerekli" hatasına neden olur

Bu sadece dilin bir özelliği mi yoksa bende bir şey mi yaptım?

package whatever 

import collection.mutable._ 
object Whatever { 

    type ObservableHashSet[T] = HashSet[T] with ObservableSet[T] 
    class X 


    def foo { 
     new ObservableHashSet[X] 
    } 

    def bar { 
    new HashSet[X] with ObservableSet[X] 
    } 
} 

hatadır ..

error: class type required but scala.collection.mutable.HashSet[scala.Whatever.X] with scala.collection.mutable.ObservableSet[scala.Whatever.X] found 
new ObservableHashSet[X] 

cevap

13

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] 
+0

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

+0

@Richard: soru için teşekkürler. Cevabı bilmedim ve sormadan önce "tip" ile deney yapmanın öğreticiydi. –

İlgili konular