Pertanyaan Kesalahan skala: argumen tipe tidak sesuai dengan batas tipe kelas


Lihat definisi fungsi berikut:

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 
      }

}

Compiler memberi saya kesalahan berikut:

/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]={

Dan inilah definisi dari 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]{
....
}

Tahu di mana saya salah?

Pembaruan: Hal berikut tidak berfungsi:

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

Inilah kesalahannya:

 /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]={

Perbarui2: ini adalah cara penggunaannya:

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

dimana

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

dan

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

Perbarui 3: Kesalahan yang sama berlaku untuk definisi fungsi berikut:

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

5
2017-09-17 17:21


asal


Jawaban:


Anda perlu menentukan batasan untuk jenis T yang mempengaruhi metode filterEntity.

misalnya class Something[T <: AnyRef] sehingga sesuai dengan batasan pada DiscreteAttribute

Dalam kasus Anda, Anda ingin memiliki deklarasi Entity sebagai: class Entity[T <: AnyRef].


4
2017-09-17 17:45