2015-09-17 13 views
5

は、次の関数の定義を参照してください:Scalaのエラー:型の引数はクラス型パラメータの境界に準拠していない

class Entity[T](
       val pi : T => String, 
       val si : T => Map[Symbol,String], 
       val tag : ClassTag[T], 
       val address: T=>AnyRef 
) { 
     // some other definitions here ... 
     def filterEntity(attribute: DiscreteAttribute[T], value: String):Unit={ 
     // nothing 
     } 

} 

コンパイラは私に次のエラーを与える:

/Users/i-danielk/ideaProjects/saul/src/main/scala/edu/illinois/cs/cogcomp/lfs/data_model/entity/Entity.scala:67: type arguments [T] do not conform to class DiscreteAttribute's type parameter bounds [T <: AnyRef] 
[error] def filterEntity(attribute: DiscreteAttribute[T], value: String):Entity[T]={ 

そして、ここでは、の定義ですDiscreteAttribute

case class DiscreteAttribute[T <: AnyRef](
           val name : String, 
           val mapping: T => String, 
           val range : Option[List[String]] 
           )(implicit val tag : ClassTag[T]) extends TypedAttribute[T,String]{ 
.... 
} 

どこが間違っているのですか?

アップデート:以下のいずれかの動作しません。ここで

def filterEntity(attribute: DiscreteAttribute[T <: AnyRef], value: String):Entity[T]={ 

はエラーです:

/Users/i-danielk/ideaProjects/saul/src/main/scala/edu/illinois/cs/cogcomp/lfs/data_model/entity/Entity.scala:67: ']' expected but '<:' found. 
[error] def filterEntity(attribute: DiscreteAttribute[T <: AnyRef], value: String):Entity[T]={ 

アップデート2:ここではそれが使用されています方法です:

val filteredConstituent= EdisonDataModel.constituents.filterEntity(EdisonDataModel.Eview,"Token") 

object EdisonDataModel extends DataModel { 
    val Eview = discreteAttributeOf[Constituent]('CviewName){ 
    x=>x.getViewName 
} 

def discreteAttributeOf[T <: AnyRef](name : Symbol)(f : T => String)(implicit tag : ClassTag[T]) : DiscreteAttribute[T] = { 
    new DiscreteAttribute[T](name.toString,f,None) 
    } 

アップデート3: 同じエラーは、次の関数の定義のために保持している:あなたはfilterEntity方法に影響を及ぼしているT型に対する制約を定義する必要が

def filterEntity(attribute: DiscreteAttribute[T], value: String):Unit={ 
     // empty 
    } 
+2

'filterEntity'の' T'はどこから来ますか? –

+0

ここのコードサンプルは不完全です。 filterEntityの定義環境を投稿する – Daenyth

答えて

4

class Something[T <: AnyRef]のように、DiscreteAttributeの制限に一致するようにします。

Entityの宣言をclass Entity[T <: AnyRef]にしたい場合があります。

+0

これは動作しません:def filterEntity(属性:DiscreteAttribute [T <:AnyRef]、value:String):エンティティ[T] = {' – Daniel

+0

しかしその定義。あなたの例が不完全であるという質問に対するコメントを見てください。 – emilianogc

+0

私は関数の定義を完了しました(最初のコード)。何か案が? – Daniel

関連する問題