예를 들어 Scala의 실존 유형과 Java의 와일드 카드의 차이점은 무엇입니까?
-
06-07-2019 - |
문제
스택 오버플로 질문보다 좀 더 구체적입니다. 실존형이란 무엇인가?, Scala와 Scala의 차이점은 무엇입니까? 실존 유형 그리고 자바의 와일드카드, 바람직하게는 몇 가지 예시를 사용하는 것이 좋습니다.
지금까지 내가 본 모든 것에서 그들은 꽤 동등한 것 같습니다.
몇 가지 참고자료.마틴 오더스키 그들을 언급한다;구글의 내 질문에 대한 최고 히트작:
미주리: 원래 와일드카드 디자인...실존 유형에서 영감을 받았습니다.사실 원본 논문에는 실존 유형의 인코딩이 있었습니다.그런데 실제 최종 디자인이 Java로 나왔을 때 이 연결이 약간 끊어졌습니다.
해결책
이것은 Scala 사용자 메일 링리스트에 대한 Martin Odersky의 답변입니다.
원래의 Java 와일드 카드 유형 (Igarashi 및 Viroli의 Ecop Paper에 설명 된 바와 같이)은 실제로 실존 유형의 속기였습니다. 나는 Wild FJ의 Fool '05 논문에서 Wildcards의 최종 버전이 실존 적 유형과 약간의 차이를 가지고 있다고 들었습니다. 나는 어떤 의미에서 정확히 알지 못할 것입니다 (그들의 형식주의는 고전적인 실존 유형에서 너무 멀리 떨어져있어 차이를 정확히 찾아 낼 수 있습니다), 아마도 야생 FJ 용지를주의 깊게 읽으면 약간의 빛을 비출 것입니다.
그래서 Scala 실존 유형과 Java 와일드 카드는 동등한 것 같습니다.
다른 팁
그들의 주요 목적이 Java의 와일드 카드와 상호 작용하기 때문에 그것들은 동등해야합니다.
그것들은 매우 유사하지만 Scala의 실존 유형은 더 강력해야합니다. 예를 들어, Scala의 실존 유형은 상단 및 하부 경계 일 수 있지만 Java의 와일드 카드는 상단 본드 일 수 있습니다.
예를 들어 스칼라에서 :
scala> def foo(x : List[_ >: Int]) = x
foo: (x: List[_ >: Int])List[Any]
Foo는 int의 하한이있는 매개 변수 목록을 가져옵니다.
Martin Odersky의 훨씬 더 자세한 답변 (나머지는 찾을 수 있음) 여기):
스칼라에는 본질적으로 세 가지에 대한 실존 유형이 필요합니다.첫 번째는 우리가 자바의 와일드 카드를 이해해야한다는 것입니다. 그리고 실존 유형은 우리가 그들에 대한 의미입니다.두 번째는 우리가 Java의 원시 유형을 이해해야한다는 것입니다. 도서관은 여전히 도서관, 미지급 유형에 있기 때문입니다.java.util.list와 같은 Java Raw 유형을 얻으면 요소 유형을 모르는 목록입니다.그것은 또한 실존 유형으로 스칼라로 표시 될 수 있습니다.마지막으로, 우리는 높은 수준의 스칼라에서 VM에서 일어나는 일을 설명하는 방법으로 실존 유형이 필요합니다.Scala는 Java와 마찬가지로 제네릭의 Erasure 모델을 사용하므로 프로그램이 실행될 때 더 이상 유형 매개 변수가 표시되지 않습니다.우리는 Java와 상호 작용해야하기 때문에 삭제해야합니다.그러나 우리가 반성하거나 VM에서 무슨 일이 일어나는지 표현하고 싶을 때 어떻게됩니까?우리는 스칼라에있는 유형을 사용하여 JVM이하는 일을 대표 할 수 있어야하며, 실존 적 유형을 통해 그렇게 할 수 있습니다.그들은 당신이 당신이 그러한 유형의 특정 측면을 모르는 유형에 대해 이야기 할 수 있도록합니다.
그만큼 List[_]
표기법 (다른 답변이 지적한대로 Java의 더 강력한 아날로그입니다. List[?]
)는 퇴화 된 사례입니다 더 일반적인 개념 스칼라의 실존 유형.