2010-01-22 27 views
6

Aşağıdaki özellikler ve sınıflar göz önünde bulundurulur. Neden bu derleme? Bu aslında bir şey için kullanılabilir mi?Soyut tip üyelere sahip beton sınıfları

trait Container { 
    type A 
} 

trait AnotherContainer[B]{ 
    def x(b : B) : B 
} 

trait Mixed extends Container with AnotherContainer[Container#A] 

class Impl extends Mixed{ 
    def x(a : Container#A) = a 
} 

new Impl().x _ 

scala> new Impl().x _ 
res0: (Container#A) => Container#A = <function> 

Güncelleme:

class Baz { type T; } 

aslında bir özelliktir mı ama bunun için motivasyon bulamadık: #1753.

+0

Bana bir hata gibi görünüyor. –

+0

Neden? Mixed içinde bir AnotherContainer örneğinde B A, bu yüzden x için imza AnotherContainer.x ve Impl.x arasında tutarlıdır. Yoksa bir şey mi özlüyorum? –

+0

@Randall Eh, 'tip A 'soyut ve ben her yerde somutlaştığını görmüyorum. Bu yüzden, '' soyut olma ihtiyacı '' hatasını döndürmek için 'Impl' derlemeyi beklerdim. –

cevap

2

Bana yararsızsa zararsız görünüyor. X'in istediği tür mevcut değildir, bu yüzden bu yönteme geçemezsiniz. Zararsız işe yaramazlığın bir derleme zamanı hatası olup olmaması bir zevk meselesidir, sanırım. aslında x ne bakarsak

, bu şekilde, decompiles:

kimlik yöntemi yapması gerektiğini tam olarak ne
public java.lang.Object x(java.lang.Object); 
    Code: 
    0: aload_1 
    1: areturn 

(iade, türü ne olursa olsun argüman yük). Sen çok daha az kod ile eşdeğer bir şey yazabilirsiniz: hiçbir şey hariç

trait AbstractType { type T } 
class Useless extends AbstractType { def identity(t: AbstractType#T) = t } 

AbstractType # T tipi vardır, bu yüzden yine biz faydasızlığını var. Bir şey özlemediğim sürece

.

3

Örneğinizde, derleyici, >: Nothing <: Any varsayılan tür sınırlarını ekler. Aşağıdaki ikinci örnek, bir soyut tipin kullanılabilir hale geldiği (yararlı değilse) bir durumu göstermektedir.

scala> trait T { type A >: Nothing <: Any } 
defined trait T 

scala> 1: T#A 
<console>:6: error: type mismatch; 
found : Int(1) 
required: T#A 
     1: T#A 
    ^

scala> trait T { type A >: Int <: Int } 
defined trait T 

scala> 1: T#A       
res6: T#A = 1 

scala> "": T#A 
<console>:6: error: type mismatch; 
found : java.lang.String("") 
required: T#A 
     "": T#A 
    ^
+1

'trait T {type A>: Int <: Int}' sadece T {type A = Int} 'karakterini tanımlamanın karmaşık bir yoludur, sonuç aynıdır. –

+0

Evet, iletmeye çalıştığım nokta buydu. – retronym

İlgili konular