programing

Java generics의 type 파라미터에 물음표는 무엇을 의미합니까?

javaba 2022. 8. 7. 17:46
반응형

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(포함)HasWordHasWord★★★★★★★★★★★★★★★★★」

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>내가 말하고 싶은 건BinRubbish전문화 되어있기 때문에 양립할 수 없는 쓰레기에 넣을 수 없습니다.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

반응형