2017-12-10 8 views
0

누군가가 나에게 다음 코드 줄을 설명해 주시겠습니까 컴파일 시간에 결정 보인다. 파이프 라인의 Apply 메소드는 T extends POutput을 반환합니다. 인터페이스 POutput에 적용 메소드가 없습니다.적용 체인화 반환 형식은

이 경우 TextIO.read(). from (...)가 PCollection을 POutput으로 반환하고 THAT에 apply 메소드가 있습니다.

그러나 파이프 라인 계약이 끝나는 한 우리는 단지 POutput 만 반환된다는 것을 알고 있습니다. 그러면 컴파일러가 첫 번째 인수에 전달 된 인수의 유형을 확인하게됩니까? Java를 코딩 할 때 기억하고있는 내용은 런타임에만 볼 수 있습니다.

+0

유형 T는 컴파일 타임에 알려져 있습니다. –

+0

내가 생각한 것과 모순 될 것입니다. 컴파일 타임에 T가 바운드 형식으로 바뀌 었습니다. 우리의 경우에 POutput – Andrei

답변

0

서명은 다음과 같습니다이 POutput를 확장 가능한 유형 OutputT를 들어,이 방법은 (String, PTransform<? super PBegin, OutputT>)에 적용되며 OutputT를 반환한다는 것을 의미

public <OutputT extends POutput> OutputT apply(
    String name, PTransform<? super PBegin, OutputT> root) { 
    ... 
} 

.

TextIO.read()PTransform<PBegin, PCollection<String>> 확장하는 TextIO.Read 반환 그것은 PTransform<? super PBegin, OutputT> 일치 :

  • 유형 PBegin이 하찮게 PBegin
  • 유형 PCollection<String>의 슈퍼입니다 그래서 POutput

확장의 .apply() 방법은 대체 OutputT = PCollection<String>으로 적용 할 수 있습니다. OutputT의 실제 값을 .apply()의 서명으로 대체 한 후 반환 값은 PCollection<String>입니다.

당신이 (POutput로 대체되고 OutputT)를 타입 삭제 동안 발생하는 말을하는지 - Pipeline.apply()의 유형 소거 된 서명이 POutput apply(String, PTransform)이다; 컴파일 된 바이트 코드의 서명은 Pipeline입니다. 실제로 JVM이 실제로 실행될 때 관련된 것입니다. 그러나 형식 지우기는 이전에 형식 검사 후에 발생합니다. 그렇지 않으면 제네릭을 사용하는 거의 모든 Java 프로그램이 컴파일되지 않습니다.

이 정확히 Arrays.asList(1, 2, 3)를 호출 할 때 발생하는 같은 일입니다 - 유형 - 삭제 서명이 List asList(Object[])에도 불구하고 List<Integer>보다는 List<Object> 또는 List 반환합니다.

+0

자, 이제는 명시 적 캐스팅이 끝난 다음 타입 지우기가 적용되었다고 말하는 것입니다. .class 파일을 확인하면 다음과 같이 표시됩니다. 18 invokevirtual org.apache.beam.sdk.Pipeline.apply (org.apache.beam.sdk.transforms.PTransform) : org.apache.beam.sdk.values.POutput [7] 21 체크 캐스트 org.apache.beam.sdk.values.PCollection [8] [....]] 36 invokevirtual org.apache.beam.sdk.values.PCollection.apply (java.lang.String, org.apache.beam.sdk.transforms.PTransform) : org.apache.beam.sdk.values.POutput [ 13] 그래서 ... 당신 말이 맞아요! 감사! – Andrei