2010-04-28 35 views
10

ile kullanma "ekleme" yöntemine (örneğin, bir java koleksiyonu) sahip herhangi bir koleksiyonu tanımlayan bir yapısal tür tanımlamaya çalışıyorum. Bu kullanarak, ben GenericCollection üzerinde parametreyi çıkarıp koyarak çalıştıScala yapısal türlerini soyut

error: Parameter type in structural refinement may not refer to abstract type defined outside that same refinement 

aşağıdaki hata ile derleme değil belli koleksiyon

object GenericTypes { 
    type GenericCollection[T] = { def add(value: T): java.lang.Boolean} 
} 

import GenericTypes._ 
trait HigherOrderFunctions[T, CollectionType[X] <: GenericCollection[X]] { 
    def map[V](fn: (T) => V): CollectionType[V] 
    .... 
} 

class RichJList[T](list: List[T]) extends HigherOrderFunctions[T, java.util.List] 

Bu ameliyat bir kaç yüksek mertebeden fonksiyonlarını tanımlamak istediğiniz yöntem üzerinde:

:

object GenericTypes { 
    type GenericCollection = { def add[T](value: T): java.lang.Boolean} 
} 
import GenericTypes._ 
trait HigherOrderFunctions[T, CollectionType[X] <: GenericCollection] 

class RichJList[T](list: List[T]) extends HigherOrderFunctions[T, java.util.List] 

ama başka hata alıyorum

Scala'da soyut yazılı parametrelerle yapısal yazımın nasıl kullanıldığına dair bana bir tavsiyede bulunabilir mi? Ya da neyi başarmak istediğimi nasıl elde edeceğim? Çok teşekkürler!

cevap

4

ticket 1906 numaralı belgede gördüğünüz gibi, çalışma zamanında eksik tür bilgisi nedeniyle yapısal türün dışında tanımlanan soyut tipi kullanamazsınız.

Bu

Scala Language Reference (3.2.7 Compound Types) belirtilmiştir:

Within a method declaration in a structural refinement, the type of 
any value parameter may only refer to type parameters or abstract types that are 
contained inside the refinement. 

Bir türe yeni yöntemler eklemek için her zamanki gibi örtülü türü dönüştürme gereğidir.

trait HigherOrderFunctions[T, CC[_]] { 
    def zap[V](fn:() => V): CC[V] 
} 

class RichJList[T](list: java.util.List[T]) extends HigherOrderFunctions[T, java.util.List]{ 
    def zap[V](fn:() => V): java.util.List[V] = { 
     val l = new java.util.ArrayList[V] 
     l add fn() 
     l 
    } 
} 
implicit def list2RichList[T](l : java.util.List[T]) = new RichJList(l) 
new java.util.ArrayList[AnyRef]() zap (() => 2) 

derleyici tipi bu kapsamda bir örtük dönüştürme yöntemi (burada list2RichList) ile zap bir yöntem olan bir türe dönüştürmek olacak zap yöntemi cevapsız görürse.

scala> new java.util.ArrayList[AnyRef]() zap (() => 2) 
res0: java.util.List[Int] = [2]