복붙노트

[SCALA] 때 @uncheckedVariance 스칼라에 필요하고, 왜 GenericTraversableTemplate에 사용됩니까?

SCALA

때 @uncheckedVariance 스칼라에 필요하고, 왜 GenericTraversableTemplate에 사용됩니까?

@uncheckedVariance는 스칼라의 선언 사이트 분산 주석과 자바의 불변 제네릭 사이의 격차를 해소하는 데 사용할 수 있습니다.

scala> import java.util.Comparator    
import java.util.Comparator

scala> trait Foo[T] extends Comparator[T]
defined trait Foo

scala> trait Foo[-T] extends Comparator[T]     
<console>:5: error: contravariant type T occurs in invariant position in type [-T]java.lang.Object with java.util.Comparator[T] of trait Foo
       trait Foo[-T] extends Comparator[T]
             ^

scala> import annotation.unchecked._    
import annotation.unchecked._

scala> trait Foo[-T] extends Comparator[T @uncheckedVariance]    
defined trait Foo

이 java.util.Comparator는 T 매개 변수 유형이 매개 변수에 결코 반환 유형에 나타납니다 콘트라 변형이 자연스럽게이라고 말했다.

이유는 Java 인터페이스에서하지를 확장 않는 스칼라 컬렉션 라이브러리에 사용되는 :이 질문을 제기?

trait GenericTraversableTemplate[+A, +CC[X] <: Traversable[X]] extends HasNewBuilder[A, CC[A] @uncheckedVariance]

이 주석에 대한 올바른 용도는 무엇입니까?

해결법

  1. ==============================

    1.회 (그 유형 파라미터는 불변이어야한다)에 대해 가변 수집하고 (공분산 변함 왕) 불변 콜렉션 번 : 문제 GenericTraversableTemplate 두번 사용된다는 점이다.

    회 (그 유형 파라미터는 불변이어야한다)에 대해 가변 수집하고 (공분산 변함 왕) 불변 콜렉션 번 : 문제 GenericTraversableTemplate 두번 사용된다는 점이다.

    는 A 형 매개 변수 중 하나 공분산 또는 불변을 가정 GenericTraversableTemplate의 typechecks. 우리가 변경 가능한 특성에 상속 그러나, 우리는 불변성을 선택해야합니다. 반대로, 우리는 불변의 서브 클래스 공분산 싶습니다.

    우리가 GenericTraversableTemplate IN (;-) 아직) 분산 주석을 통해 추상적 할 수 없습니다 그래서 우리는 둘 중 하나는 서브 클래스에 따라 그것을 인스턴스화 수 있었다는 것을, 우리는 (@uncheckVariance은 본질적으로 일종의 캐스트입니다) 캐스팅에 의존해야하기 때문에 . 추가 읽기 위해, 나는 내 논문을 추천합니다 (죄송합니다 ;-)) 또는 최근의 bitrot 용지

  2. ==============================

    2.내 논문에서 나는 종류 언어의 일부로 경계 및 분산 주석이있는 수학, Scalina를 설명 (이전 버전은 또한 워크샵 용지로 사용할 수 있습니다). 이 토론에 관련성 내가이 미적분학을 개발 먹고 싶어하는 다음 단계 : 그래서 당신은 경계 (쉬운)과 분산 주석 (내 머리 회전한다) 위에 추상 수있는 그 위에 또 다른 레이어를 구축 할 수 있습니다. 사실, 당신은 단지 그들이 모든 수준에서 작동 귀하의 다형성 (polymorphism)의 구조를 일반화하고 "속성"을 만들어 거기에 한 층 더 압정, 오히려 않을 것이다 일반 유형으로 (범위, 분산 주석, 암시 적 인수를 ... 필수) 추상화에 대한 모든 될 수 있습니다 특별한 종류와.

    내 논문에서 나는 종류 언어의 일부로 경계 및 분산 주석이있는 수학, Scalina를 설명 (이전 버전은 또한 워크샵 용지로 사용할 수 있습니다). 이 토론에 관련성 내가이 미적분학을 개발 먹고 싶어하는 다음 단계 : 그래서 당신은 경계 (쉬운)과 분산 주석 (내 머리 회전한다) 위에 추상 수있는 그 위에 또 다른 레이어를 구축 할 수 있습니다. 사실, 당신은 단지 그들이 모든 수준에서 작동 귀하의 다형성 (polymorphism)의 구조를 일반화하고 "속성"을 만들어 거기에 한 층 더 압정, 오히려 않을 것이다 일반 유형으로 (범위, 분산 주석, 암시 적 인수를 ... 필수) 추상화에 대한 모든 될 수 있습니다 특별한 종류와.

    아이디어는 독특한 유형의 맥락에서 Edsko 드 브리스에 의해 잘 설명 "속성은 유형입니다."

  3. ==============================

    3.내가 @uncheckedVariance를 사용하는 다른 시간에 발견 - 합성 방법을 그 반환 추상 형식의 매개 변수의 기본값 :

    내가 @uncheckedVariance를 사용하는 다른 시간에 발견 - 합성 방법을 그 반환 추상 형식의 매개 변수의 기본값 :

    M:\>scala -Xprint:typer -e "class C { def p[T >: Null](t: T = null) = t }"
    [[syntax trees at end of typer]]// Scala source: (virtual file)
    package <empty> {
      final object Main extends java.lang.Object with ScalaObject {
        def this(): object Main = {
          Main.super.this();
          ()
        };
        def main(argv: Array[String]): Unit = {
          val args: Array[String] = argv;
          {
            final class $anon extends scala.AnyRef {
              def this(): anonymous class $anon = {
                $anon.super.this();
                ()
              };
              class C extends java.lang.Object with ScalaObject {
                <synthetic> def p$default$1[T >: Null <: Any]: Null @scala.annotation.unchecked.uncheckedVariance = null;
                def this(): this.C = {
                  C.super.this();
                  ()
                };
                def p[T >: Null <: Any](t: T = null): T = t
              }
            };
            {
              new $anon();
              ()
            }
          }
        }
      }
    
  4. from https://stackoverflow.com/questions/2454281/when-is-uncheckedvariance-needed-in-scala-and-why-is-it-used-in-generictravers by cc-by-sa and MIT license