programing

에 추가하려면 해야 하나요?에 추가하려면 해야 하나요?에 추가하려면 해야 하나요?데이터 구조데이터 구조데이터 구조

goodcopy 2022. 7. 23. 13:21
반응형

에 추가하려면 해야 하나요?데이터 구조

다음과 같이 선언된 목록이 있습니다.

 List<? extends Number> foo3 = new ArrayList<Integer>();

나는 foo3에 3을 더하려고 했다.다만, 다음과 같은 에러 메세지가 표시됩니다.

The method add(capture#1-of ? extends Number) in the type List<capture#1-of ?
extends Number> is not applicable for the arguments (ExtendsNumber)

미안하지만 안 돼요.

'''List<? extends Number> foo3 「」, 「」, 「」가,foo3에는 (특정 유형의 값이 아닌) 유형 패밀리의 모든 값을 포함할 수 있습니다.이는 다음 중 하나가 법적 할당임을 의미합니다.

List<? extends Number> foo3 = new ArrayList<Number>();  // Number "extends" Number
List<? extends Number> foo3 = new ArrayList<Integer>(); // Integer extends Number
List<? extends Number> foo3 = new ArrayList<Double>();  // Double extends Number

이 를 추가할 수 요?List foo3입니다.ArrayList★★★★

  • 하면 안 요.Integerfoo3 가리키고 수 있다List<Double>.
  • 하면 안 요.Doublefoo3 가리키고 수 있다List<Integer>.
  • 하면 안 요.Numberfoo3 가리키고 수 있다List<Integer>.

오브젝트를 추가할 수 없습니다.List<? extends T>왜냐하면 당신은 어떤 종류의 사람들이List에 그 안에 수 수 없습니다.List은 ' 수 는 것, ' 수 있다'는 것, '읽을 수 있다'는밖에 없어요T 는classclassclass의 T.

은 에 됩니다.super 예 , ) 。List<? super T>다음은 합법입니다.

List<? super Number> foo3 = new ArrayList<Number>(); // Number is a "super" of Number
List<? super Number> foo3 = new ArrayList<Object>(); // Object is a "super" of Number

수 예: T는 읽을 수 없습니다).Number부터의 설명List<? super T>왜냐하면 당신은 어떤 종류의 사람들이List그것은 정말 가리키고 있다.'은, 「보증」이라고 하는 은, 「의 값을 「보증」이라고 하는 것은, 「보증」이라고 하는 것 뿐입니다.T 의 )T )는, 되고 있는 ( )


예가 바로 ''입니다.Collections.copy():

public static <T> void copy(List<? super T> dest, List<? extends T> src)

「 」가 어떻게 있는지 해 주세요.src declaration 에서는 " " 가 사용됩니다.extends관련된 리스트 타입의 패밀리로부터 리스트를 건네주는 것과 동시에, T타입의 값이나 T의 서브 클래스의 값을 생성하는 것을 보증합니다.ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ.src참조해 주세요.

dest declaration 에서는 " " 가 사용됩니다.super관련된 목록 유형의 패밀리에서 목록을 전달하고 해당 목록에 특정 유형 T의 값을 쓸 수 있음을 보증합니다.그러나 리스트에서 읽으면 특정 타입 T의 을 읽을 수 있다고 보장할 수 없습니다.

범용 와일드카드 덕분에 이 단일 방법으로 다음 중 하나의 콜을 실행할 수 있게 되었습니다.

// copy(dest, src)
Collections.copy(new ArrayList<Number>(), new ArrayList<Number>());
Collections.copy(new ArrayList<Number>(), new ArrayList<Integer>());
Collections.copy(new ArrayList<Object>(), new ArrayList<Number>());
Collections.copy(new ArrayList<Object>(), new ArrayList<Double>());

이 혼란스럽고 매우 넓은 코드를 당신의 두뇌를 운동시키는 것으로 생각하세요.코멘트된 행은 불법이며, 그 이유는 행의 오른쪽 끝에 기재되어 있습니다(그 중 일부를 표시하려면 스크롤해야 합니다).

  List<Number> listNumber_ListNumber  = new ArrayList<Number>();
//List<Number> listNumber_ListInteger = new ArrayList<Integer>();                    // error - can assign only exactly <Number>
//List<Number> listNumber_ListDouble  = new ArrayList<Double>();                     // error - can assign only exactly <Number>
  
  List<? extends Number> listExtendsNumber_ListNumber  = new ArrayList<Number>();
  List<? extends Number> listExtendsNumber_ListInteger = new ArrayList<Integer>();
  List<? extends Number> listExtendsNumber_ListDouble  = new ArrayList<Double>();
  
  List<? super Number> listSuperNumber_ListNumber  = new ArrayList<Number>();
//List<? super Number> listSuperNumber_ListInteger = new ArrayList<Integer>();      // error - Integer is not superclass of Number
//List<? super Number> listSuperNumber_ListDouble  = new ArrayList<Double>();       // error - Double is not superclass of Number
  

//List<Integer> listInteger_ListNumber  = new ArrayList<Number>();                  // error - can assign only exactly <Integer>
  List<Integer> listInteger_ListInteger = new ArrayList<Integer>();
//List<Integer> listInteger_ListDouble  = new ArrayList<Double>();                  // error - can assign only exactly <Integer>
  
//List<? extends Integer> listExtendsInteger_ListNumber  = new ArrayList<Number>(); // error - Number is not a subclass of Integer
  List<? extends Integer> listExtendsInteger_ListInteger = new ArrayList<Integer>();
//List<? extends Integer> listExtendsInteger_ListDouble  = new ArrayList<Double>(); // error - Double is not a subclass of Integer
  
  List<? super Integer> listSuperInteger_ListNumber  = new ArrayList<Number>();
  List<? super Integer> listSuperInteger_ListInteger = new ArrayList<Integer>();
//List<? super Integer> listSuperInteger_ListDouble  = new ArrayList<Double>();     // error - Double is not a superclass of Integer


  listNumber_ListNumber.add(3);             // ok - allowed to add Integer to exactly List<Number>
  
  // These next 3 are compile errors for the same reason:
  // You don't know what kind of List<T> is really
  // being referenced - it may not be able to hold an Integer.
  // You can't add anything (not Object, Number, Integer,
  // nor Double) to List<? extends Number>      
//listExtendsNumber_ListNumber.add(3);     // error - can't add Integer to *possible* List<Double>, even though it is really List<Number>
//listExtendsNumber_ListInteger.add(3);    // error - can't add Integer to *possible* List<Double>, even though it is really List<Integer>
//listExtendsNumber_ListDouble.add(3);     // error - can't add Integer to *possible* List<Double>, especially since it is really List<Double>

  listSuperNumber_ListNumber.add(3);       // ok - allowed to add Integer to List<Number> or List<Object>
  
  listInteger_ListInteger.add(3);          // ok - allowed to add Integer to exactly List<Integer> (duh)

  // This fails for same reason above - you can't
  // guarantee what kind of List the var is really
  // pointing to
//listExtendsInteger_ListInteger.add(3);   // error - can't add Integer to *possible* List<X> that is only allowed to hold X's
  
  listSuperInteger_ListNumber.add(3);      // ok - allowed to add Integer to List<Integer>, List<Number>, or List<Object>
  listSuperInteger_ListInteger.add(3);     // ok - allowed to add Integer to List<Integer>, List<Number>, or List<Object>

안전하지 않은 캐스팅 없이는 할 수 없습니다.읽을 수 있는 건 그것뿐이에요.

문제는 리스트가 정확히 무엇인지 모른다는 것이다.Number의 모든 서브클래스의 리스트일 수 있기 때문에 요소를 넣으려고 하면 실제로 그 요소가 리스트에 들어가는지 알 수 없습니다.

예를 들어 리스트는 다음 리스트일 수 있습니다.Bytes, s, s를 지정하면 에러가 발생합니다.Float그 안에.

나는 여기서 답을 읽었지만, Pavel Minaev의 코멘트를 발견할 때까지 혼란스러웠다.

List <? extends Number >는 "다양한 유형의 객체 목록, 모두 Number를 확장한 것"을 의미하는 것은 아닙니다.이는 "번호가 확장되는 단일 유형의 개체 목록"을 의미합니다.

그 후 나는 BertF의 멋진 설명을 이해할 수 있었다.List < ? extensions Number >는 임의의 타입의 확장 번호(Integer, Double 등)를 의미하며, 그 중 어느 것이 맞는지 선언(List <? extensions Number > list)에서 명확하지 않습니다.따라서 add 메서드를 사용할 때 입력이 같은 타입인지 어떤지는 알 수 없습니다.어떤 타입인지 알 수 없습니다.

따라서 List <? extends Number > 요소는 구성 시에만 설정할 수 있습니다.

또, 다음의 점에 주의해 주세요.템플릿을 사용할 때는 컴파일러에 어떤 타입을 사용하고 있는지 알려 줍니다.를 들어, T는 우리를 위해 그 타입을 유지하지만, 그렇지 않다?는 같은 타입입니다.

내가 말할게..이것은 설명/학습해야 할 더러운 것 중 하나입니다.

"목록 '< ? extends Number >는 실제로는 상한 와일드카드입니다!

상한 와일드카드에서는 Number 또는 Number 자체를 확장한 모든 클래스를 정식 파라미터 유형으로 사용할 수 있습니다.문제는 Java가 List의 실제 유형을 모른다는 사실에서 비롯됩니다.정확하고 고유한 유형이어야 합니다.도움이 되었으면 합니다:)

대신 이 작업을 수행할 수 있습니다.

  List<Number> foo3 = new ArrayList<Number>();      
  foo3.add(3);

다른 유형의 목록에 대한 참조를 만들어 위조할 수 있습니다.

(이것들은 sepp2k가 언급한 '안전하지 않은 캐스팅'입니다.)

List<? extends Number> list = new ArrayList<Integer>();

// This will not compile
//list.add(100);

// WORKS, BUT NOT IDEAL
List untypedList = (List)list;
// It will let you add a number
untypedList.add(200);
// But it will also let you add a String!  BAD!
untypedList.add("foo");

// YOU PROBABLY WANT THIS
// This is safer, because it will (partially) check the type of anything you add
List<Number> superclassedList = (List<Number>)(List<?>)list;
// It will let you add an integer
superclassedList.add(200);
// It won't let you add a String
//superclassedList.add("foo");
// But it will let you add a Float, which isn't really correct
superclassedList.add(3.141);
// ********************
// So you are responsible for ensuring you only add/set Integers when you have
// been given an ArrayList<Integer>
// ********************

// EVEN BETTER
// If you can, if you know the type, then use List<Integer> instead of List<Number>
List<Integer> trulyclassedList = (List<Integer>)(List<?>)list;
// That will prevent you from adding a Float
//trulyclassedList.add(3.141);

System.out.println("list: " + list);

왜냐면untypedList,superclassedList그리고.trulyclassedList에 대한 참조일 뿐입니다.list원래 Array List에 요소를 추가할 수 있습니다.

실제로 사용할 필요는 없습니다.(List<?>)위의 예에서는, 다만, 코드에 필요하게 되는 경우가 있습니다.list넌 주어졌어

「 」를 사용하고 있는 에 주의해 .?경고 메시지가 경고는 보다 위에 표시됩니다.

@SuppressWarnings("unchecked")

은 '3'이기 primitive (int)되지 않음Number 타입의 경우는, 박스 타입을 수 있습니다.(Integer.valueOf(3))로서 IDEA할 수 있습니다

언급URL : https://stackoverflow.com/questions/2776975/how-can-i-add-to-list-extends-number-data-structures

반응형