it-swarm.com.de

Liste <Objekt> und Liste <?>

Ich habe zwei Fragen, actaully ..... Zunächst einmal: Warum kann ich das nicht tun?

List<Object> object = new List<Object>();

Und zweitens habe ich eine Methode, die einen List<?> zurückgibt. Wie würde ich das in einen List<Object> verwandeln? 

Vielen Dank!

17
Chris

Warum kann ich das nicht tun:

List<Object> object = new List<Object>();

Sie können dies nicht tun, da List eine Schnittstelle ist und Schnittstellen nicht instanziiert werden können. Nur (konkrete) Klassen können sein. Beispiele für konkrete Klassen, die List implementieren, umfassen ArrayList , LinkedList usw.

So erstellen Sie eine Instanz von ArrayList:

List<Object> object = new ArrayList<Object>();

Ich habe eine Methode, die einen List<?> zurückgibt, wie würde ich daraus einen List<Object> machen?

Zeigen Sie uns den relevanten Code und ich werde die Antwort aktualisieren.

35
NPE
List<Object> object = new List<Object>();

Sie können dies nicht tun, daListeine Schnittstelle ist und Sie keine Objekte einer Schnittstelle erstellen können oder in anderen Word-Objekten, die keine Schnittstelle instanziieren können. Außerdem können Sie jedem Objekt der Klasse, das List implementiert, seiner Referenzvariablen zuweisen. Zum Beispiel können Sie dies tun: 

list<Object> object = new ArrayList<Object>();

HierArrayListist eine Klasse, dieListimplementiert. Sie können jede Klasse verwenden, dieListimplementiert. 

4
Chandra Sekhar

List ist eine Schnittstelle, die Sie nicht instanziieren können. Verwenden Sie stattdessen eine seiner Implementierungen, z.

List<Object> object = new List<Object>();

Über List: Sie können jedes Objekt als generischen Parameter für die Instanz verwenden:

List<?> list = new ArrayList<String>();

oder

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

Während der Verwendung von List<Object> ist diese Deklaration ungültig, da sie vom Typ missmatch ist.

2
Alex Stybaev
package com.test;

import Java.util.ArrayList;
import Java.util.List;

public class TEst {

    public static void main(String[] args) {

        List<Integer> ls=new ArrayList<>();
        ls.add(1);
        ls.add(2);
        List<Integer> ls1=new ArrayList<>();
        ls1.add(3);
        ls1.add(4);
        List<List<Integer>> ls2=new ArrayList<>();
        ls2.add(ls);
        ls2.add(ls1);

        List<List<List<Integer>>> ls3=new ArrayList<>();
        ls3.add(ls2);


        m1(ls3);
    }

    private static void m1(List ls3) {
        for(Object ls4:ls3)
        {
             if(ls4 instanceof List)    
             {
                m1((List)ls4);
             }else {
                 System.out.print(ls4);
             }

        }
    }

}
0
jitendra rawat

Ja, um Ihre zweite Frage zu beantworten, können Sie den List<?> als List<Object> oder List<T> eines beliebigen Typs umwandeln, da der Parameter ? (Wildcard) angibt, dass die Liste eine homogene Auflistung einer any Object enthält. Es gibt jedoch keine Möglichkeit, beim Kompilieren zu wissen, was die type ist, da sie nur Teil der exportierten API ist. Dies bedeutet, dass Sie nicht sehen können, was in List<?> eingefügt wird.

So würden Sie die Besetzung machen:

List<?> wildcardList = methodThatReturnsWildcardList();
// generates Unchecked cast compiler warning
List<Object> objectReference = (List<Object>)wildcardList;

In diesem Fall können Sie die Warnung ignorieren, da ein Objekt für die Verwendung in einer generischen Klasse ein Untertyp von Object sein muss. Nehmen wir an, dass wir versuchen, dies als List<Integer> zu konvertieren, wenn es tatsächlich eine Sammlung von Strings enthält.

// this code will compile safely
List<?> wildcardList = methodThatReturnsWildcardList();
List<Integer> integerReference = (List<Integer>)wildcardList;

// this line will throw an invalid cast exception for any type other than Integer
Integer myInteger = integerRefence.get(0);

Denken Sie daran: Generische Typen werden zur Laufzeit gelöscht. Sie wissen nicht, was die Sammlung enthält, aber Sie können ein Element aufrufen und .getClass() aufrufen, um den Typ zu bestimmen.

Class objectClass = wildcardList.get(0).getClass();
0
Ian R. O'Brien