문제 :
Java 서명 마이그레이션에 대한 이 질문 살펴보기
public <A extends Comparable<? super A>> void sort(List<A> list) { }
스칼라에게는 피할 수있는 방법이없는 것 같습니다.
illegal cyclic reference involving type T
이렇게 문자 그대로 번역하면 오류가 발생합니다.
def compilerFailure[T <: Comparable[_ >: T]](a: Array[T]): T = { }
해결 방법은 대신이 작업을 수행하는 것 같습니다.
def workaround[A <: Comparable[U], U >: A](list: List[A]) { }
바이트 코드에서 Java로 다시 왕복하면 ( super
부분 이 느슨해집니다 )
public <T extends Comparable<U>, U> void scalaToJava(List<U> a) { }
내 질문 :
는 IS scalaToJava
다음 버전에 상응?
public <T extends Comparable<?>> void sort(List<T> a) {
나는 때 생각하지 U
억제 할 수없는, 그것은뿐만 아니라 수 있습니다 ?
또는 Object
더? 그렇다면 Scala workaround
버전 은 다음 과 같습니다.
def sort[A <: Comparable[_]](list: List[A]) { }
그것들은 모두 내 사용 사례에 맞게 컴파일되는 것 같습니다 (컬렉션에 다른 하위 유형을 넣고 정렬 할 수 있음). NB. 나는 역학과 순환 참조 오류의 원인에 대해 궁금하며 Scala가 공분산 등의 측면에서 더 나은 대안을 제공한다는 것을 알고 Ordering
있습니다.
public <T extends Comparable<?>> void sort(List<T> a)
예를 들어 List<A> extends Comparable<Int>
비교 함수가 유형 값에 적용되지 않는 위치 를 전달할 수 있기 때문에 너무 일반적 List<A>
입니다.
해결 방법을 올바르게 선택했지만 약간의 실수를했습니다. 그것은해야한다:
def workaround[A <: Comparable[A], U >: A](list: List[U]) { }
그러나 이것은 이러한 종류의 상황이 일반적으로 Scala에서 해결되는 방식이 아닙니다.
을 참조하십시오 scala.math.Ordering
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다