클래스 서명에서 스칼라 제네릭 이해

높이 장

최근에 저는 Spark SQL의 내부를 조사 중이며 org.apache.spark.sql.catalyst.trees 패키지에서이 핵심 클래스 TreeNode를 만났습니다.

abstract class TreeNode[BaseType <: TreeNode[BaseType]] extends Product {
// scalastyle:on
  self: BaseType =>

  val origin: Origin = CurrentOrigin.get

위는이 클래스의 작은 코드 부분입니다. 참조 할 수 있도록 클래스 이름과 패키지 이름을 제공했습니다. 더 많은 코드 세그먼트가 필요한 경우이를 고정 할 수 있습니다.

나는 스칼라에 익숙하지 않으며이 제네릭을 이해하기가 조금 어렵다는 것을 알게되었습니다. 이에 대해 두 가지 질문이 있습니다.

  1. 이 제네릭은 TreeNode가 TreeNode [BaseType]의 유형 또는 하위 유형 인 내부 요소를 포함해야한다고 생각합니다. 그러나 여기서 나를 혼란스럽게 만드는 것은 첫 번째 BaseType이 TreeNode [BaseType]의 유형 또는 하위 유형이라는 것입니다. 그러나 두 번째 BaseType은 어떻습니까? 유형에 대한 제한이 있습니까?
  2. 이 클래스에는 명시 적 생성자가 없으므로이 컴파일 검사가 적용되는 위치가 확실하지 않습니다. 또한이 일반적인 개념의 소유자가 무엇인지 명확하지 않습니다. 이것은 HashMap <K, V>의 Node <K, V>와 같은 것을 의미합니다. 나는 그것의 바로 그 하위 유형을 추적했고 홀더와 같은 것은 전혀 보지 못했다.

누구든지 이것을 명확히 도울 수 있기를 바랍니다. 미리 감사드립니다.

jwvh

이것은 "F-bounded polymorphism"이라는 패턴입니다. (내가 말할 수있는 한, 아무도 그 이름이 어디에서 왔는지 확실하지 않습니다.)

// T must be a subtype of Entity[T]
trait Entity[T <: Entity[T]] { self: T =>
  //methods defined here
}

이를 통해 컴파일러는 특정 관계 패턴을 적용합니다.

class A extends Entity[A]  <-- OK
class B extends Entity[A]  <-- won't compile

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

스칼라에서 다른 데이터 유형을 제네릭으로 래핑

분류에서Dev

제네릭 클래스 유형 제약이있는 제네릭 메서드

분류에서Dev

제네릭에 의해 서로 결합 된 클래스

분류에서Dev

Java`sort` 서명을`? 슈퍼 T`에서 스칼라로 (제네릭)

분류에서Dev

제네릭 클래스에서 Java 제네릭 클래스 인스턴스화

분류에서Dev

제네릭 유형이 1 개인 클래스에서 제네릭 유형이 2 개인 메서드

분류에서Dev

스칼라에서 제한된 제네릭 클래스를 작성하는 방법

분류에서Dev

구체적인 클래스를 스칼라의 제네릭 메서드 인스턴스화

분류에서Dev

제네릭 클래스에서 인터페이스 확장시 NoSuchFieldError

분류에서Dev

C ++ : 제네릭 클래스의 비 제네릭 메서드?

분류에서Dev

C ++ : 제네릭 클래스의 비 제네릭 메서드?

분류에서Dev

비 제네릭 클래스의 제네릭 메서드

분류에서Dev

비 제네릭 클래스의 제네릭 클래스 메서드

분류에서Dev

제네릭 클래스에서 정적 메서드를 사용하는 해결 방법이 있습니까?

분류에서Dev

제네릭 클래스에서 변수 이름을 바꿀 수 있습니까?

분류에서Dev

Django : 쿼리 셋 속성이 클래스 기반 제네릭 뷰에서 작동하는 방식 이해하기

분류에서Dev

JAVA의 제네릭 클래스에서 오버라이드 메서드를 사용하는 방법

분류에서Dev

C # 제네릭, 여기서 T 클래스 : (상속 클래스)

분류에서Dev

제네릭 클래스에서 캐스트 강제

분류에서Dev

스칼라. 클래스를 제네릭으로 만들기

분류에서Dev

C #에서 제네릭 클래스 인스턴스화

분류에서Dev

dart에서 제네릭 클래스 인스턴스화

분류에서Dev

제네릭에서 파생 된 클래스 컬렉션에서 제네릭 기본 클래스 사용

분류에서Dev

제네릭 메서드에 제네릭 클래스 객체 보내기 (Java)

분류에서Dev

스칼라에서 2 개의 케이스 클래스 인스턴스 비교

분류에서Dev

신속하게 제네릭에 클래스 메타 데이터 제공 (Codable)

분류에서Dev

제네릭 클래스 및 서브 클래 싱 배열

분류에서Dev

제네릭 메서드에서 클래스 별 속성 처리

분류에서Dev

typescript에서 제네릭이있는 클래스 인스턴스를 어떻게 감지 할 수 있습니까?

Related 관련 기사

  1. 1

    스칼라에서 다른 데이터 유형을 제네릭으로 래핑

  2. 2

    제네릭 클래스 유형 제약이있는 제네릭 메서드

  3. 3

    제네릭에 의해 서로 결합 된 클래스

  4. 4

    Java`sort` 서명을`? 슈퍼 T`에서 스칼라로 (제네릭)

  5. 5

    제네릭 클래스에서 Java 제네릭 클래스 인스턴스화

  6. 6

    제네릭 유형이 1 개인 클래스에서 제네릭 유형이 2 개인 메서드

  7. 7

    스칼라에서 제한된 제네릭 클래스를 작성하는 방법

  8. 8

    구체적인 클래스를 스칼라의 제네릭 메서드 인스턴스화

  9. 9

    제네릭 클래스에서 인터페이스 확장시 NoSuchFieldError

  10. 10

    C ++ : 제네릭 클래스의 비 제네릭 메서드?

  11. 11

    C ++ : 제네릭 클래스의 비 제네릭 메서드?

  12. 12

    비 제네릭 클래스의 제네릭 메서드

  13. 13

    비 제네릭 클래스의 제네릭 클래스 메서드

  14. 14

    제네릭 클래스에서 정적 메서드를 사용하는 해결 방법이 있습니까?

  15. 15

    제네릭 클래스에서 변수 이름을 바꿀 수 있습니까?

  16. 16

    Django : 쿼리 셋 속성이 클래스 기반 제네릭 뷰에서 작동하는 방식 이해하기

  17. 17

    JAVA의 제네릭 클래스에서 오버라이드 메서드를 사용하는 방법

  18. 18

    C # 제네릭, 여기서 T 클래스 : (상속 클래스)

  19. 19

    제네릭 클래스에서 캐스트 강제

  20. 20

    스칼라. 클래스를 제네릭으로 만들기

  21. 21

    C #에서 제네릭 클래스 인스턴스화

  22. 22

    dart에서 제네릭 클래스 인스턴스화

  23. 23

    제네릭에서 파생 된 클래스 컬렉션에서 제네릭 기본 클래스 사용

  24. 24

    제네릭 메서드에 제네릭 클래스 객체 보내기 (Java)

  25. 25

    스칼라에서 2 개의 케이스 클래스 인스턴스 비교

  26. 26

    신속하게 제네릭에 클래스 메타 데이터 제공 (Codable)

  27. 27

    제네릭 클래스 및 서브 클래 싱 배열

  28. 28

    제네릭 메서드에서 클래스 별 속성 처리

  29. 29

    typescript에서 제네릭이있는 클래스 인스턴스를 어떻게 감지 할 수 있습니까?

뜨겁다태그

보관