8

以下は、実行しようとしているコードです。

class Student {
  def printDetails = println("I am a student")
  def printSomeOtherDetails = println("I love Studying")
}

class ComputerScienceStudent extends Student {
  override def printDetails = println("I am a Computer Science Student")
  override def printSomeOtherDetails = println("I love Scala")
}

class InformationTechnologyStudent extends Student {
  override def printDetails = println("I am an Information Technology Student")
  override def printSomeOtherDetails = println("I love Java")
}

class MyGenericClassForUpperBound {
  def printStudentDetails[S <: Student](student: S) = {
    student.printDetails
    student.printSomeOtherDetails
  }
}

class MyGenericClassforLowerBound {
  def printStudentDetails[S >: ComputerScienceStudent](student: S) = {
    student.printDetails
    student.printSomeOtherDetails
  }
}

printStudentDetailsからのメソッドMyGenericClassforLowerBoundが問題を作成しています。ステートメントstudent.printDetailsstudent.printSomeOtherDetailsは私に言っています

value printDetails is not a member of type parameter S

私が理解している限り:

  • Q[A <: B]クラス/メソッドは、 Classが class のサブタイプである class のQ任意のオブジェクトを取ることができることを意味します。これを上限と呼びます。AAB
  • Q[A >: B]クラス/メソッドは、 Classが class のスーパータイプである class のQ任意のオブジェクトを取ることができることを意味します。これを下限と呼びます。AAB

私の理解が間違っている場合は助けてください。また、上記の問題が発生する理由を理解するのを手伝ってください。みんなありがとう。

4

1 に答える 1

14

あなたの理解は間違っていませんが、あなたは結果を追っていません。

Object具体的には、明示的な上限が指定されていない場合、実際にはすべてのパラメーターに の上限があります。printStudentDetailsこれは、 typeのメソッドの場合に発生していますMyGenericClassforLowerBound。つまり、 type の値をObjectパラメーターとしてこのメ​​ソッドに合法的に渡すことができます。しかし、タイプはメソッドをObject定義していないため、エラーが発生します。printDetailsprintSomeOtherDetails

メソッドをコンパイルするには、適切な上限 ( と同様MyGenericClassforUpperBound) も指定する必要があります。たとえば、次のようになります。

def printStudentDetails[S >: ComputerScienceStudent <: Student](student: S) = { ...

ただし、この場合、下限が事実上冗長になることに注意してください。これは、サブクラスのパラメーターをStudent正常に渡すことができるためです。これはStudent、上限を満たす type として処理できるためです。したがって、偶数InformationTechnologyStudentおよびサブクラスをComputerScienceStudent渡すことができます。成功しました。この種の構造は、2 つの異なる階層からの型が混在する値を渡される可能性がある場合に、より便利です。

于 2013-11-06T20:20:08.303 に答える