2013-08-05 16 views

cevap

12

Anahtar Kelime type type alias bildirimi için, val ve def gibi, değer ve yöntem bildirimi içindir. Bu durumda, kısıtlamaları olan soyut bir tür takma adıdır, yani yerel kapsamdaki trait veya class - türünde bir takma adın soyut üyesi olamaz ve kısıtlamaları olamaz.

Tip Ident, AnyRef ve Null türünün bir alt türüdür.

AnyRef

AnyRef bütün referans türlerinin bir atası, bu kadar Int, Long, Char ve dışındaki tüm türleri (Java ilkel) 'dir.

Boş

Null tüm "null" türlerinin alt tipidir. Aslında, tüm referans türlerinin bir alt tipi. Tüm AnyRef yana

>: Null sadece ek kısıtlama Ident Nothing olmadığıdır null bulunmaktadır.

Scala’s type hierarchy bakınız:

Scala’s type hierarchy

+0

Hızlı bir takip sorusu daha sonra ('meraklı olduğum için), alt sınır burada gereksiz değil mi? 'Null' tüm referans türlerinin alt tipi olduğundan ve tip zaten * herhangi bir referans türü * olarak tanımlanan üst sınırı var mı? –

+0

Teşekkürler, hiyerarşiyi biliyorum, ama sorum buydu bu komut – Pooya

+1

@ PatrykĆwiek: Sanırım öyle. Ancak "Boş" tipi, değerin "boş" olabileceği konusunda açık bir uyarı olarak belirtilebilir. – senia

1

Ident ve AnyRef onun süper tip olduğu bir tipidir. Gelen her tip bu sınırları sık görülen alt Nothing, ancak (.. vb Int, Long dahil) Hiçbir şey her şeyin bir alt tipi olduğu zaman bütün nesnenin bir alt tipi olan ile o Null olmak nasıl

şeyler belirtmek olmadan Null ve Hiçbir şey, Tip Sisteminde, temel olarak (Contra/Co) varyans türünde kullanılır. Örnek:

sealed trait Container[+A >: Null <: AnyRef] 
case class Full[A >: Null <: AnyRef](value: A) extends Container[A] 
case object Empty extends Container[Null] 

mükemmel Bu derleyici

val c: Container[String] = Full("String") 
val e: Container[String] = Empty 

Ama bizim alt sınır boş ve üst AnyRef çünkü bu, başarısız:

val ff: Container[Int] = Full(10) 
val f: Container[Int] = Empty 

Biz bu beacuse burada Int koyamazsınız tür, çakışmaları ihlal eder

7

@ Sénia cevabı Ekleme: Bu bir tip beyan değil, bu

gibi bağlamında bulunan bir soyut tip elemanı beyannamesi, olduğu

ve Foo'un herhangi bir somut uygulamasınınolmak üzere bir tür tanımlaması gerektiği anlamına gelirve bu tür @ senia'nın cevabında açıklanan kısıtlamaları yerine getirmelidir.

+0

Evet, bu tür bir tanımlama özellikte idi – Pooya