최근에 저는 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
위는이 클래스의 작은 코드 부분입니다. 참조 할 수 있도록 클래스 이름과 패키지 이름을 제공했습니다. 더 많은 코드 세그먼트가 필요한 경우이를 고정 할 수 있습니다.
나는 스칼라에 익숙하지 않으며이 제네릭을 이해하기가 조금 어렵다는 것을 알게되었습니다. 이에 대해 두 가지 질문이 있습니다.
누구든지 이것을 명확히 도울 수 있기를 바랍니다. 미리 감사드립니다.
이것은 "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] 삭제
몇 마디 만하겠습니다