Java generics의 type 파라미터에 물음표는 무엇을 의미합니까?
이것은 Stanford 파서에 부속되어 있는 몇 가지 예에서 발췌한 코드 조각입니다.자바에서 약 4년 동안 개발했지만, 이 코드의 스타일은 무엇을 의미하는지 잘 이해하지 못했습니다.
List<? extends HasWord> wordList = toke.tokenize();
암호에 대한 자세한 내용은 걱정하지 않습니다.제가 혼란스러운 것은 영어의 일반적인 표현이 정확히 무엇을 전달해야 하는지입니다.
누가 이걸 설명해 줄 수 있나요?
? extends HasWord
"클래스/인터페이스는HasWord
" 다시 말해,HasWord
그 자신이나 그 자식들 중 누구라도...기본적으로 사용할 수 있는 모든 것instanceof HasWord
플러스null
.
좀 더 기술적인 용어로 말하면,? extends HasWord
는 139페이지부터 시작하는 유효한 Java 3rd Edition 항목 31에서 다루는 경계 와일드카드입니다.제2판의 같은 장은 온라인으로 PDF로 제공됩니다. 경계 와일드카드의 부분은 134페이지에서 시작하는 항목 28입니다.
업데이트: PDF 링크는 Oracle에서 삭제한 후 업데이트되었습니다.현재, 런던 퀸 메리 대학의 전자 공학 및 컴퓨터 과학 대학원이 주최하는 카피를 가리키고 있습니다.
업데이트 2: 와일드카드를 사용하는 이유에 대해 좀 더 자세히 설명하겠습니다.
시그니처가 전달될 것으로 예상되는 메서드를 선언한 경우List<HasWord>
, 그러면 당신이 통과할 수 있는 유일한 것은List<HasWord>
.
단, 해당 서명이List<? extends HasWord>
그럼 넌 합격할 수 있을 거야List<ChildOfHasWord>
대신.
주의해 주세요.List<? extends HasWord>
그리고.List<? super HasWord>
Joshua Bloch가 말했듯이: PECS = 생산자-생산자, 소비자-슈퍼.
즉, 메서드가 데이터를 추출하는 컬렉션(즉, 메서드가 사용할 요소를 생성하는 컬렉션)을 전달하려면 다음을 사용해야 합니다.extends
메서드가 데이터를 추가하는 컬렉션을 전달하고 있는 경우(즉, 메서드가 생성하는 컬렉션이 소비하고 있는 요소)에는 이 컬렉션을 사용해야 합니다.super
.
혼란스럽게 들릴 수 있습니다.단, 에서 확인할 수 있습니다.List
의 명령어(이것은 Collections.sort의 2arg 버전에 대한 숏컷에 불과합니다).약을 복용하는 대신Comparator<T>
「」, 「」가 필요하게 됩니다.Comparator<? super T>
는 의 List
목록 자체를 재정렬하기 위해 사용합니다.
물음표는 '모든 유형'을 나타내는 기호입니다. ?
은 ""을 의미합니다.
" " " " 확장 임의의
Object
(포함)Object
)
위의 예시는
타입의 확장
HasWord
(포함)HasWord
HasWord
★★★★★★★★★★★★★★★★★」
List<? extends HasWord>
는 HasWord를 받아들입니다.…을 하다
public class A extends HasWord { .. }
public class B extends HasWord { .. }
public class C { .. }
public class D extends SomeOtherWord { .. }
...그wordList
가 같은 또는 "B" 또는 "B"를에 둘 중 의 목록만 할 수 .null
인스턴스()에 실패합니다.HasWorld
아마도 "실제 세계"의 교묘한 예가 도움이 될 것이다.
우리 회사에는 다른 맛의 쓰레기통이 있다.모든 쓰레기통에는 쓰레기가 들어있지만, 일부 쓰레기통은 전문적이기 때문에 모든 종류의 쓰레기를 가지고 다니지는 않습니다., 이렇게 '우리'가 있어요.Bin<CupRubbish>
★★★★★★★★★★★★★★★★★」Bin<RecylcableRubbish>
가 .를수 해야 합니다.HalfEatenSandwichRubbish
수 .Bin<Rubbish>
내가 말하고 싶은 건Bin
의Rubbish
전문화 되어있기 때문에 양립할 수 없는 쓰레기에 넣을 수 없습니다.Bin<? extends Rubbish>
.
(주의:? extends
읽기 전용이 아닙니다.예를 들어, 적절한 예방 조치를 취하면, 특수성이 불분명한 쓰레기통에서 쓰레기를 꺼내고, 나중에 다른 곳에 다시 넣을 수 있습니다.)
그게 얼마나 도움이 될지 모르겠어.다형성이 존재하는 상황에서 포인터 투 포인터가 완전히 확실한 것은 아닙니다.
영어:
그건...
List
클래스를 확장하는 어떤 종류의HasWord
,포함하여HasWord
일반적으로는?
제네릭스에서 모든 클래스를 의미합니다.그리고 그extends SomeClass
개체가 확장되어야 함을 지정합니다.SomeClass
(혹은 그 클래스일 수도 있습니다).
물음표는 와일드카드를 정의하는 데 사용됩니다.다음 URL에서 Oracle 관련 문서를 확인하십시오.http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
언급URL : https://stackoverflow.com/questions/3009745/what-does-the-question-mark-in-java-generics-type-parameter-mean
'programing' 카테고리의 다른 글
기본 자식이 있는 Vue.js 중첩 라우팅 (0) | 2022.08.07 |
---|---|
C에서 Ctrl+C를 잡다 (0) | 2022.08.07 |
Vue.js에서 이러한 종속성을 찾을 수 없습니다. (0) | 2022.08.07 |
Maven에서는 간단한 Java 10 / Java 11 프로젝트를 컴파일할 수 없습니다. (0) | 2022.08.07 |
vue-router에서 1개 이외의 모든 루트를 잠글 수 있습니까?안전한가요?아니면 다른 방법을 써야 할까? (0) | 2022.08.07 |