[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.회 (그 유형 파라미터는 불변이어야한다)에 대해 가변 수집하고 (공분산 변함 왕) 불변 콜렉션 번 : 문제 GenericTraversableTemplate 두번 사용된다는 점이다.
회 (그 유형 파라미터는 불변이어야한다)에 대해 가변 수집하고 (공분산 변함 왕) 불변 콜렉션 번 : 문제 GenericTraversableTemplate 두번 사용된다는 점이다.
는 A 형 매개 변수 중 하나 공분산 또는 불변을 가정 GenericTraversableTemplate의 typechecks. 우리가 변경 가능한 특성에 상속 그러나, 우리는 불변성을 선택해야합니다. 반대로, 우리는 불변의 서브 클래스 공분산 싶습니다.
우리가 GenericTraversableTemplate IN (;-) 아직) 분산 주석을 통해 추상적 할 수 없습니다 그래서 우리는 둘 중 하나는 서브 클래스에 따라 그것을 인스턴스화 수 있었다는 것을, 우리는 (@uncheckVariance은 본질적으로 일종의 캐스트입니다) 캐스팅에 의존해야하기 때문에 . 추가 읽기 위해, 나는 내 논문을 추천합니다 (죄송합니다 ;-)) 또는 최근의 bitrot 용지
-
==============================
2.내 논문에서 나는 종류 언어의 일부로 경계 및 분산 주석이있는 수학, Scalina를 설명 (이전 버전은 또한 워크샵 용지로 사용할 수 있습니다). 이 토론에 관련성 내가이 미적분학을 개발 먹고 싶어하는 다음 단계 : 그래서 당신은 경계 (쉬운)과 분산 주석 (내 머리 회전한다) 위에 추상 수있는 그 위에 또 다른 레이어를 구축 할 수 있습니다. 사실, 당신은 단지 그들이 모든 수준에서 작동 귀하의 다형성 (polymorphism)의 구조를 일반화하고 "속성"을 만들어 거기에 한 층 더 압정, 오히려 않을 것이다 일반 유형으로 (범위, 분산 주석, 암시 적 인수를 ... 필수) 추상화에 대한 모든 될 수 있습니다 특별한 종류와.
내 논문에서 나는 종류 언어의 일부로 경계 및 분산 주석이있는 수학, Scalina를 설명 (이전 버전은 또한 워크샵 용지로 사용할 수 있습니다). 이 토론에 관련성 내가이 미적분학을 개발 먹고 싶어하는 다음 단계 : 그래서 당신은 경계 (쉬운)과 분산 주석 (내 머리 회전한다) 위에 추상 수있는 그 위에 또 다른 레이어를 구축 할 수 있습니다. 사실, 당신은 단지 그들이 모든 수준에서 작동 귀하의 다형성 (polymorphism)의 구조를 일반화하고 "속성"을 만들어 거기에 한 층 더 압정, 오히려 않을 것이다 일반 유형으로 (범위, 분산 주석, 암시 적 인수를 ... 필수) 추상화에 대한 모든 될 수 있습니다 특별한 종류와.
아이디어는 독특한 유형의 맥락에서 Edsko 드 브리스에 의해 잘 설명 "속성은 유형입니다."
-
==============================
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(); () } } } }
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
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라 2.10 반사, 나는 경우 클래스의 경우 클래스, 즉 필드 목록에서 필드 값을 추출 어떻게 (0) | 2019.11.15 |
---|---|
[SCALA] 스칼라의 형식 매개 변수로 표현 형식의 인스턴스를 인스턴스화하는 방법 (0) | 2019.11.15 |
[SCALA] 왜 보조 기술은 타입 수준의 계산에 필요합니까? (0) | 2019.11.15 |
[SCALA] 왜 스칼라 특성은 클래스를 확장 할 수 있습니다? (0) | 2019.11.15 |
[SCALA] 스칼라 - 인쇄 배열 (0) | 2019.11.15 |