[java] Collections.emptyList ()는 List <Object>?를 반환합니다.

일반 유형 매개 변수를 유추하는 Java 규칙을 탐색하는 데 문제가 있습니다. 선택적 목록 매개 변수가있는 다음 클래스를 고려하십시오.

import java.util.Collections;
import java.util.List;

public class Person {
  private String name;
  private List<String> nicknames;

  public Person(String name) {
    this(name,Collections.emptyList());
  }

  public Person(String name,List<String> nicknames) {
    this.name = name;
    this.nicknames = nicknames;
  }
}

내 Java 컴파일러는 다음 오류를 제공합니다.

Person.java:9: The constructor Person(String, List<Object>) is undefined

그러나 Collections.emptyList()type <T> List<T>이 아닌을 반환합니다 List<Object>. 캐스트를 추가해도 도움이되지 않습니다

public Person(String name) {
  this(name,(List<String>)Collections.emptyList());
}

수확량

Person.java:9: inconvertible types

EMPTY_LIST대신에 사용emptyList()

public Person(String name) {
  this(name,Collections.EMPTY_LIST);
}

수확량

Person.java:9: warning: [unchecked] unchecked conversion

다음과 같이 변경하면 오류가 사라집니다.

public Person(String name) {
  this.name = name;
  this.nicknames = Collections.emptyList();
}

누구든지 내가 여기에서 실행중인 유형 검사 규칙과 그 문제를 해결하는 가장 좋은 방법을 설명 할 수 있습니까? 이 예제에서 최종 코드 예제는 만족 스럽지만 클래스가 클수록 코드를 복제하지 않고이 “선택적 매개 변수”패턴에 따라 메소드를 작성할 수 있기를 원합니다.

추가 크레딧 : EMPTY_LIST대신에 사용하는 것이 언제 적절한 emptyList()가요?



답변

발생하는 문제는 메소드 emptyList()가을 반환 하더라도 List<T>유형을 제공하지 않았으므로 기본값은으로 반환된다는 것 List<Object>입니다. type 매개 변수를 제공하고 다음과 같이 코드가 예상대로 작동하도록 할 수 있습니다.

public Person(String name) {
  this(name,Collections.<String>emptyList());
}

이제 직접 할당을 수행 할 때 컴파일러가 일반 유형 매개 변수를 알아낼 수 있습니다. 이것을 타입 추론이라고합니다. 예를 들어, 이렇게 한 경우 :

public Person(String name) {
  List<String> emptyList = Collections.emptyList();
  this(name, emptyList);
}

그런 다음 emptyList()호출은을 올바르게 반환합니다 List<String>.


답변

사용하고 싶은 것 :

Collections.<String>emptyList();

emptyList가 무엇인지 소스를 보면 실제로는

return (List<T>)EMPTY_LIST;


답변

emptyList 메소드에는 다음과 같은 서명이 있습니다.

public static final <T> List<T> emptyList()

즉, <T>이 결과에 할당되는 변수의 형태에서 일반적인 파라미터 T 값을 유추하는 단어 목록 수단 전에. 따라서이 경우 :

List<String> stringList = Collections.emptyList();

그런 다음 반환 값은 type 변수에 의해 명시 적으로 참조 List<String>되므로 컴파일러가이를 알아낼 수 있습니다. 이 경우 :

setList(Collections.emptyList());

컴파일러가 제네릭 형식을 파악하는 데 사용할 명시적인 반환 변수가 없으므로 기본값은 Object입니다.


답변