constructor type 인수가 type 앞에 배치되는 것은 무엇을 의미합니까?
최근에 우연히 이 특이한 자바 구문을 알게 되었습니다.예를 들어 다음과 같습니다.
List list = new <String, Long>ArrayList();
「」의 위치에 .<String, Long>
arguments... beforetype 인수일반적으로 type 뒤에 있는 것이 아니라 이전입니다.그리고 이 때 2종류의 인수는 2종류가 있습니다.ArrayList
. . . . . . .
type 인수 배치는 type 뒤에 붙이는 것과 같은 의미입니까?그렇지 않은 경우 포지셔닝이 다르다는 것은 무엇을 의미합니까?
왜요?ArrayList
1밖에 ★★★★★★★★★★★★★★★★★?
나는 평소 장소들을 찾아보았다.Angelika Langer 등입니다만, ANTLR 프로젝트의 Java 문법 파일에 있는 문법 규칙 이외에는 이 구문에 대한 언급을 찾을 수 없습니다.
범용 생성자 호출
이것은 이례적이지만 완전히 유효한 Java입니다.이를 이해하려면 클래스에 범용 생성자가 있을 수 있음을 알아야 합니다. 예를 들어 다음과 같습니다.
public class TypeWithGenericConstructor {
public <T> TypeWithGenericConstructor(T arg) {
// TODO Auto-generated constructor stub
}
}
범용 생성자를 통해 클래스를 인스턴스화할 때 형식 인수를 명시적으로 할 필요가 거의 없다고 생각합니다.예를 들어 다음과 같습니다.
new TypeWithGenericConstructor(LocalDate.now(ZoneId.systemDefault()));
, 이제T
★★★★★★★★★★★★★★★」LocalDate
자바 타입입니다.그런 다음 질문의 구문을 사용하여 명시적으로 제공합니다.
new <LocalDate>TypeWithGenericConstructor(null);
물론 가독성이나 어떤 이유로든 도움이 된다고 생각되는 경우에는 필요하지 않지만 공급될 수도 있습니다.
new <LocalDate>TypeWithGenericConstructor(LocalDate.now(ZoneId.systemDefault()));
은 신의 the the the the the the the the the the the the 라고 부르고 있는 것.java.util.ArrayList
아닙니다그것은 범용이 아닙니다).ArrayList
그건 다른 문제예요.)Java에서 타입 인수를 사용하지 않을 때 콜에서 지정할 수 있는 이유에 대해서는 다음 편집을 참조하십시오.내 이클립스는 나에게 경고를 준다.
ArrayList 유형의 일반 생성자가 아닌 ArrayList()에 대해 사용되지 않는 형식 인수입니다. 인수 <String, Long>을 사용하여 매개 변수를 지정할 수 없습니다.
된다(, 이 프로그램에서는 ' 누락'에 경고가 ).List
★★★★★★★★★★★★★★★★★」ArrayList
을 사용하다
일반 클래스 대 일반 생성자
type 인수 배치는 type 뒤에 붙이는 것과 같은 의미입니까?그렇지 않은 경우 포지셔닝이 다르다는 것은 무엇을 의미합니까?
아니, 달라.type 뒤에 통상적인 type 인수/초(ArrayList<Integer>()
)는 범용 클래스용입니다.앞의 형식 인수는 생성자에 대한 것입니다.
다음 두 가지 양식을 조합할 수도 있습니다.
List<Integer> list = new <String, Long>ArrayList<Integer>();
리스트 스토어가 있는 것을 알 수 있기 때문에 조금 더 정확하다고 생각합니다.Integer
오브젝트(그래도 무의미한 것은 생략하고 싶다)<String, Long>
물론입니다).
ArrayList에는 1개밖에 없는데 2종류의 인수를 사용하는 것이 합법인 이유는 무엇입니까?
첫째, 유형 전에 type 인수를 지정할 경우 클래스가 아닌 생성자에 대해 올바른 번호를 지정해야 합니다.따라서 이 값은 type 인수의 개수와 무관합니다.ArrayList
클래스가 생겼어요.즉, 이 경우 생성자는 type 인수를 사용하지 않기 때문에 아무것도 제공하지 않아야 합니다(일반적이지 않습니다).어쨌든 공급하면 무시되기 때문에 공급 대수와 공급 대수는 중요하지 않습니다.
의미 없는 유형의 인수는 왜 허용됩니까?
링크에 대해 Thanks to @Slaw를 사용하여 편집: Java는 모든 메서드콜에서 type 인수를 허용합니다.착신측 메서드가 범용인 경우 type 인수가 사용되며 그렇지 않은 경우 무시됩니다.예를 들어 다음과 같습니다.
int length = "My string".<List>length();
네, 말도 안 돼요.Java Language Specification(JLS; Java 언어 사양)은 서브섹션 15.12.2.1에서 다음과 같은 근거를 제시합니다.
이 규칙은 호환성과 대체성의 원칙의 문제에서 비롯된다.인터페이스 또는 슈퍼클래스는 서브타입과는 독립적으로 생성될 수 있으므로 범용 메서드를 비일반 메서드로 덮어쓸 수 있습니다.다만, 타입 인수를 명시적으로 건네주는 콜을 포함한 범용 메서드에 대한 콜에는, 우선(비범용) 방식을 적용할 수 있을 필요가 있습니다.그렇지 않으면 생성된 슈퍼유형을 서브유형으로 대체할 수 없을 것이다.
이 인수는 생성자를 직접 재정의할 수 없으므로 사용할 수 없습니다.하지만 나는 그들이 이미 복잡한 규칙을 너무 복잡하게 만들지 않기 위해 같은 규칙을 가지고 싶어했다고 생각한다.어떤 경우에도, 인스턴스화에 관한 섹션 15.9.3 및new
두 번 이상 15.12.2를 참조합니다.
링크
- CodesJava의 제네릭 컨스트럭터
- JLS 15.9.3컨스트럭터와 그 인수 선택
- JLS 15.12.2.1잠재적으로 적용할 수 있는 방법 식별
- 모든 메서드 호출에 대해 유형 목격자를 허용해야 하는 이유는 무엇입니까?
일반적이지 않은 메서드/컨스트럭터에는 임의의 범용 파라미터를 부가할 수 있습니다.
new <Long>String();
Thread.currentThread().<Long>getName();
컴파일러는 이러한 유형의 인수를 실제 범용 파라미터와 일치시킬 필요가 없기 때문에 상관하지 않습니다.
컴파일러는 인수를 확인해야 하는 즉시 불일치를 호소합니다.
Collections.<String, Long>singleton("A"); // does not compile
컴파일러 버그로 보이는데요.
언급URL : https://stackoverflow.com/questions/55330697/what-do-constructor-type-arguments-mean-when-placed-before-the-type
'source' 카테고리의 다른 글
SELECT * FROM table_name\G에 \G가 표시되는 이유는 무엇입니까? (0) | 2022.09.23 |
---|---|
nodejs의 단일 파일에 mysql 데이터베이스 연결을 제공하는 방법 (0) | 2022.09.23 |
Python 판다를 사용한 모든 복제품 목록은 어떻게 얻을 수 있나요? (0) | 2022.09.23 |
php 문자열 연결, 성능 (0) | 2022.09.23 |
속성 Javadoc 작성 방법 (0) | 2022.09.23 |