바운드 형식 매개 변수가 Animal[A <: String]
인 클래스 정의가 주어지면 Scala 컴파일러가 B <: String
을 Animal[B]
에서 유추하지 않는 것으로 보입니다. 추론은 허용됩니까? 추측을하기 위해 컴파일러를 돕는 방법?언 바운드 형식 매개 변수가있는 멤버를 사용하여 사례 클래스를 정의하는 방법은 무엇입니까?
다음은이 추론의 부족이 문제가되는 사례 클래스의 구체적인 예입니다.
sealed trait Person[+T <: Person[T]]
case class Student() extends Person[Student]
case class Professor() extends Person[Professor]
은 내가 예를 val p: Person[_] = Student()
를 들어, Person[_]
의 변수로 인스턴스화 할 수있는 경우 클래스 University
를 정의해야
case class University(p: Person[_])
하지만이 오류와 함께 컴파일 실패 : 나는 경우 클래스가 컴파일 University
의 형식 매개 변수를 결합하면
type arguments [Any] do not conform to trait Person's type parameter bounds [+T <: Person[T]]
가 (그것도으로 컴파일
case class BoundUniversity[P <: Person[P]](p: Person[P])
그러나이 매개 변수화 버전이 될 수 없습니다 : 내가 case
키워드를 삭제하지만 내 경우 옵션)가 아닌 경우 무제한의 매개 변수
inferred type arguments [_$1] do not conform to method apply's type parameter bounds [P <: Person[P]]
:
def general[P <: Person[P]](p: P) = println(p)
그래서 이것이
val p: Person[_] = Student()
BoundUniversity(p)
실패가 컴파일 : 유형 Person[_]
의 억제 할 수없는 변수로 인스턴스화 클래스 생성자에만 국한되지는 않습니다.
두 질문 :
유형
Person
이 유형의 각 인스턴스가 그 경계를 존중하는 보험에 가입되도록, 파라미터 경계Person[+T <: Person[T]]
로 정의된다val p: Person[P]
이 의미P <: Person[P]
그; 또는 나는 무엇인가 놓치고 있냐? 그렇다면 컴파일러에게 어떻게하면 불평하지 않도록 할 수 있습니까?어떻게/
case class University(p: Person[_])
과 같은 언 바운드 형식 매개 변수가있는 멤버를 사용하여 사례 클래스를 정의 할 수 있습니까?
'T'는 공변이어야합니까? – leedm777
@dave 내 특별한 경우에'T'는 공변이어야하지만 이것이 문제를 변화시키지 않는다고 생각합니다 : 소개 예제를보십시오. –
[추상 유형] (http://docs.scala-lang.org/tutorials/tour/abstract-types.html)을 사용하여 어딘가에 얻을 수 있지만 [꽤 많이 변하지 않습니다] (http : // stackoverflow. com/a/5359015/115478). – leedm777