Generische Liste

Status
Nicht offen für weitere Antworten.
S

SlaterB

Gast
kann ich folgenden Code generisch anders machen, so dass ich nicht die Fehlermeldung bekomme?
Code:
public class Test2
{
    public static void main(String[] args)
        throws Exception
    {
        MyList myList = null;

        // Type mismatch: cannot convert from element type Object to A
        for (A a : myList.getTList())
        {
        }
    }

}

class A
{

}

class MyList<T extends A>
{
    private List<T> entries = new ArrayList<T>();

    public List<T> getTList()
    {
        return entries;
    }
}
ich habe paar Sub-Listen mit Elementen als Subklassen von A,
will manchmal aber einfach nur die Liste mit A-Elementen allgemein verarbeiten
und dabei nicht ständig MyList<T> schreiben müssen oder ähnlich geklammertes,
 
S

SlaterB

Gast
ich darf nicht mal eine zweite Operation erstellen, die entries auf List<A> castet,
irgendwie scheint jegliches Generics ausgeschaltet?

Code:
public class Test2
{
    public static void main(String[] args)
        throws Exception
    {
        MyList myList = null;

        // for (A a : myList.getTList())
        // {
        // }


        // Type safety: The expression of type List needs unchecked conversion to conform
        // to List<Long>
        List<Long> l = myList.getLongList();
    }

}


class A
{

}


class MyList<T extends A>
{
    private List<T> entries = new ArrayList<T>();

    public List<T> getTList()
    {
        return entries;
    }

    public List<Long> getLongList()
    {
        return new ArrayList<Long>();
    }
}
 

Bjoern2

Mitglied
Wenn deine "myList" null ist, kannst du logischerweiße auch nicht drauf zugreifen! ;-)

Edit: Du solltest auch vielleicht besser mit den runden Klammern casten.
Also
Code:
ClassA a = (ClassA)myClassB;
 
S

SlaterB

Gast
das ist ein Testprogramm, es geht mir um die Warning beim Zugriff,
die ist unabhängig von der Bestimmung des Objektes, also habe ich diesen unwichtigen Teil weggelassen..
(sind ja eh nur Testklassen)
 
S

SlaterB

Gast
was möchtest du mir damit sagen?
das Ziel des ganzen ist ja gerade, nicht casten zu müssen?
 
G

Guest

Gast
Versuch's mal damit:

Code:
public class Test2
{
	public static <T extends A> void main(String[] args) throws Exception
	{
		MyList<T> myList = null;

		for (A a : myList.getTList())
		{
		}
	}
}

Die NullPointerException gibt's beim Starten natürlich immer noch ;)

Fred
 
S

SlaterB

Gast
interessant, aber leider bei mir nicht sinnvoll,
wie gesagt: ohne irgendwelches Geklammere bei der Benutzung
(Benutzung in zig verschiedenen Operationen/ Klassen)

nur zusätzliche/ andere Generics in der Listen-Klasse, falls das noch irgendwie hilft ;)
 
S

SlaterB

Gast
was willst du mir denn damit sagen?
List<Long> l = myList.getLongList();
soll funktionieren und nicht durch was anderes ersetzt werden ;)
 

Bjoern2

Mitglied
So klappts wunderbar:

Code:
import java.util.*;

class MyList<T extends A>
{
    private List<T> entries = new ArrayList<T>();

    public List<T> getTList()
    {
        return entries;
    }

    public List<Long> getLongList()
    {
        return new ArrayList<Long>();
    }
}

Code:
import java.util.*;

public class Test2
{
    public static void main(String[] args)
        throws Exception
    {
        MyList myList = new MyList<A>();
        List l = myList.getLongList();
    }

}

Code:
class A
{

}


Die erwähnte Fehlermeldung war übrigens kein Fehler, sondern eine Warnung.
Hätte sich also trotzdem kompilieren lassen.
 
S

SlaterB

Gast
deine Aussage ist also, dass ich
a.) alle Generics rausnehmen kann
oder
b.) die Meldungen ignorieren kann,

beides ist absolut klar und von Anfang an nicht das Thema,
es geht ja darum, Generics zu verwenden..
(ok, so richtig deutlich bin ich auch nicht in der Beschreibung)

und um es nicht aus den Augen zu verlieren: das Ziel ist das erste Beispiel, da ist es ne Fehlermeldung, keine Warning,
 

JPKI

Top Contributor
Muss die Klasse MyList nicht Collection erweitern, damit du mittels foreach-Schleife drauf zugreifen kannst?
 
S

SlaterB

Gast
ich greife mit for-each auf myList.getTList() zu, welche eine Liste zurückgibt
 

Bjoern2

Mitglied
Hast du es mal mit einer ganz einfachen Zählschleife versucht?

Code:
for(i=0;i<myList.size();i++)
{
    //Mach was. mit myList.get(i);
}

Oder so:
Code:
Iterator it = myList.iterator();
while(it.hasNext())
{
    Object obj = it.next();
}
 
S

SlaterB

Gast
du bist ja hartnäckig ;)

for -Schleife und Iterator wären zum einen noch schlimmer als nur mal eben<T> zu schreiben, was ich vermeiden will,
zum anderen würde das nicht verhindern, dass ich immer noch nur den Typ Object und nicht den Typ A bekomme,

for (Object obj : myList.getTList())
{
}

funktioniert ja bereits, das ist nicht das Problem,
ich will aber A (und nein, ich will nicht casten ;) )
 

Bjoern2

Mitglied
Warum machst du eigentlich nicht sowas:
Code:
public class Test2
{
    public static void main(String[] args) throws Exception
    {
        MyList myList = new MyList();

        for(int i=0;i<myList.size();i++)
        {
            A a = myList.get(i); 
            //Er müsste jetzt eigentlich wissen, dass das geht, weil MyList von A erbt 
            //und der Funktion gesagt wurde, dass die Liste aus MyList besteht.
        }

    }

}

class A
{

}

class MyList extends A
{
    private List<MyList> entries = new ArrayList<MyList>();

    public List<MyList> getTList()
    {
        return entries;
    }
}
(Achtung! Nicht ausprobiert.)

Also das T ist jetzt weg.
Ist das für dich jetzt in Ordnung? ;-)


Übrigens versteh ich nicht, warum du meinst, dass eine FOR-Schleife schlechter wäre, als eine FOREACH-Schleife. ???:L
 
S

SlaterB

Gast
ist das jetzt noch erst gemeint?

aus einer generischen MyList, die generische Elemente A enthält,
machst du eine nichtgerische MyList, die von A erbt und nichtgenerische Elemente MyList enthält? ;)
hat das noch was mit meinem Programm zu tun?

> warum du meinst, dass eine FOR-Schleife schlechter wäre, als eine FOREACH-Schleife.

schlechter weil Code länger, das ist ja einer der Gründe, warum es for-each überhaupt gibt:
schicke kurze Syntax
 
R

Roar

Gast
sorry björn aber dein code ist totaler blödsinn. er funktioniert nicht, er macht auch keinen sinn und hat mit der frage auch nichts mehr zu tun :bloed: :(
slater: damit keine warnungen mehr kommen musst du deine myList parametisieren (dort kommt doch auch eine warnung..)
 

Bjoern2

Mitglied
Roar hat gesagt.:
sorry björn aber dein code ist totaler blödsinn. er funktioniert nicht, er macht auch keinen sinn und hat mit der frage auch nichts mehr zu tun :bloed: :(
Ja. Sorry. Hab meinen Fehler gerade eingesehen.
War ein Denkfehler von mir. Sorry.
 

Bjoern2

Mitglied
Roar hat gesagt.:
slater: damit keine warnungen mehr kommen musst du deine myList parametisieren (dort kommt doch auch eine warnung..)

Also so? :)
Code:
public class Test2
{
    public static void main(String[] args) throws Exception
    {
        MyList<DERTYP> myList = null;

        for (A a : myList.getTList())
        {

        }
    }

}
 
S

SlaterB

Gast
> damit keine warnungen mehr kommen musst du deine myList parametisieren (dort kommt doch auch eine warnung..)

naja,
"Usage of a raw type" ist bei mir abgeschaltet,
sonst hätte ich ja bei jedem allgemeinen Zugriff auf die Superklasse oder jeder Hilfsoperation wie

Code:
    public static boolean isEmpty(Collection collection)
    {
        return collection == null || collection.isEmpty();
    }
Warnung oder Schreibaufwand,

oder Map, Class und Comparable, die ich überall als einfache Basisklassen verwende.. ;)

und wie gesagt: selbst wenn es nur eine Warning wäre,
aber das ist im ersten Beispiel ja direkt ein Fehler

wenn's nicht geht, dann nicht, kein Problem
 
S

SlaterB

Gast
ja klar, ich meinte nur, dass ich mit einer Warning leben könnte wenn ich nicht parametrisiere,
also dass das Auftreten dieser Raw-Type-Warning für mich kein endgültiger Grund wäre, den Parameter reinzunehmen,

aber diese Fehlermeldung da macht mir aber Probleme, deswegen werde ich parametrisieren müssen (oder andere Hilfspoerationen verwenden)

--------

> gerade bei solchen klassen sind die generics doch besonders sinnvoll

jeder wie er möchte,
ich z.b. mache mehrere Datenbankanfragen,
"aggegriere Tabelle x nach Feld y"
y kann String oder Integer, BigDecimal oder Enum sein,
die Paare (y, Gruppensumme) kommen dann in Maps, in Listen,
werden sortiert, formatiert usw.
Comparable als Basisklasse ist da super, habe dann im Quellcode 100x Comparable irgendwo als Parameter oder Exemplarvariable stehen,
das überall zu parametrisieren wäre ein reiner Unfall
 
G

Guest

Gast
SlaterB hat gesagt.:
Comparable als Basisklasse ist da super, habe dann im Quellcode 100x Comparable irgendwo als Parameter oder Exemplarvariable stehen,
das überall zu parametrisieren wäre ein reiner Unfall
Mir ist immer noch nicht ganz klar, was überhaupt der Sinn von MyList ist. Soll das nur eine Abkürzung sein, um nicht immer List<T> schreiben zu müssen oder wie? Dann mach's doch so:

Code:
public class Test2
{
	public static void main(String[] args) throws Exception
	{
		MyList myList = null;

		for (A a : myList)
		{
		}
	}
}

class A
{
}

class MyList extends ArrayList<A>
{
	private static final long serialVersionUID = -4961928283264201181L;
}

Wahrscheinlich habe ich aber einfach nicht kapiert, wozu MyList überhaupt gut sein soll.

Fred
 
G

Guest

Gast
Anonymous hat gesagt.:
Code:
class MyList extends ArrayList<A>
{
	private static final long serialVersionUID = -4961928283264201181L;
}
Schöner ist es natürlich mit Interfaces:

Code:
interface MyList extends List<A>
{
}

Fred
 

Marco13

Top Contributor
Um die Warnung wegzukriegen gibt es IMHO und AFAIK zwei Möglichkeiten. Entweder man schreibt eben nicht
Code:
        MyList myList = null;
sondern
Code:
        MyList<A> myList = null;
Auch wenn ich nicht sehe, was daran so schlimm sein soll, wolltest du das ja nicht - falls ich dich richtig verstanden habe.

Die andere Möglichkeit wäre sowas wie
Code:
class MyList extends MyListImpl<A>
{}

class MyListImpl<T extends A>
{
    private List<T> entries = new ArrayList<T>();

    public List<T> getTList()
    {
        return entries;
    }
}
aber so ein "Krampf", nur um sich das <A> zu ersparen (und dafür an den Stellen, wo man den Typ DOCH angeben will, immer MyListImp<Typ> schreiben zu müssen) lohnt sich wohl nicht.

Die Seiten zu
http://forum.java.sun.com/thread.jspa?threadID=456239&messageID=4082065
und
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6444048
hast du vermutlich schon gesehen. Und genau DAS wäre ja das, was du wolltest (falls ich dich richtig verstanden habe)
 
S

SlaterB

Gast
diese ganzen Vorschläge finde ich recht seltsam, die ändern ja total mein Programm, nehmen immer Generics raus..

MyList extends ArrayList ist nicht ganz falsch, ändert aber an der Genericsproblematik sicherlich nix, denn
class MyList extends ArrayList<A>
müsste ja
class MyList<T extends A> extends ArrayList<T>
oder so heißen, soll ja generisch sein

und zur Frage, warum nicht direkt so: MyList hat nunmal in Wirklichkeit noch zig andere Funktionen,
enthält neben der Liste auch noch eine Map der enthaltenen Objekte usw,
das ist ja letztlich egal


das Problem von
class MyList extends MyListImpl<A>
ist ebenso, dass MyList dann nicht mehr generisch wäre..

ich habe im Programm ja Objekte von Unterklassen
MyListB extends MyList
MyListC extends MyList<C>

(B und C Unterklassen von A)

--------

MyList<A>
sieht hier vielleicht nicht schlimm aus,
in Wirklichkeit steht dann aber überall
HistoryBaseList<SimpleHistoryElement>
statt einfach nur HistoryBaseList

und das finde ich blöde, überall im Programm <SimpleHistoryElement> zu wiederholen,
obwohl HistoryBaseList<T extends SimpleHistoryElement>
doch so definiert ist, dass SimpleHistoryElement drin ist,

das müsste man doch automatisch erkennen,

wenn ich von einer belieben dieser Liste die Elemente hole,
warum sind die vom Typ Object und nicht vom angegebenen Mindesttyp?

zurück zum MyList-Beispiel: es können nur A-Objeke oder Subklassen drin sein,
das sollte doch einfach erkennbar sein, ohne diese Info durch <A> redundant an zig Stellen im Programm zu wiederholen

die beiden Links scheinen damit nix zu tun zu haben, aber danke
 
R

Roar

Gast
warum willst du MyList dann überhaupt generisch machen oder gibt es dann irgendwann eine HistoryBaseList<ComplexHistoryElement> für ein problem das sich nicht mit einer vernünftigen klassenhierarchie lösen lässt? ???:L
 

Marco13

Top Contributor
Die Links haben insofern damit zu tun, als dass du bei einer Deklaration wie
Code:
    MyList myList = null;
dem Typ-Parameter "T" von MyList<T extends A> ja implizit "A" zuweisen willst. In Anlehung an die Links bräuchtest du eben ein Konstrukt wie
Code:
class MyList<T=A extends A> {...} // A ist damit der "Default-Wert" für T

Ich finde, dass deine Frage zwar gerechtfertigt ist, da ja schließlich eindeutig und unmißverständlich (zur Compilezeit!) erkannt werden könnte, dass die Liste IMMER Objekte vom Type 'A' enthalten muss. Aber damit würde vermutlich die Rückwärtskompatibilität kaputtgemacht oder so. Wenn man keinen Typ angibt, ist es eben "Object", und das extendet auch nichts... Find' dich damit ab :wink:
 
S

SlaterB

Gast
ich finde mich damit ab, ich frag ja nur ;)

@Roar:
ich habe mehrere History-Objekte in der Hierarchie und mehrere Listenklassen,
eine für jeden Typ mit Funktionalität,

die Listenklassen erben nicht voneinander und haben auch feste Namen ohne <irgendwas>,
nur wenn ich gemeinsame Funktionalität für die Basisliste implementiere, die sich dann logischerweise auch nur auf die Basiselemente bezieht, muss ich ja mit der Basisklasse und <igitt> arbeiten,

ich finde Generics toll für solche Klassenhierarchien,
aber man sollte sie verstecken können, und nicht bei jeder Benutzung daran erinnert werden,
manchmal stören sie einfach ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
R Frage zu einfügen in generische lineare Liste Allgemeine Java-Themen 7
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
F Verständnisprobleme Aufgabenstellung Aktionsobjekte und generische Listen Allgemeine Java-Themen 1
J Generische Interface - Problem Allgemeine Java-Themen 3
J Generische Interfaces mehrfach einbinden Allgemeine Java-Themen 11
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
T Interface mit generische Typen Allgemeine Java-Themen 5
A Methoden Generische Methode mit Arrays - Source Compatibility 1.7 benötigt, wieso? Allgemeine Java-Themen 3
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
H Interface Generische Schnittstelle (rekusiv) Allgemeine Java-Themen 2
C generische Authentifizierung Allgemeine Java-Themen 7
JCODA Generische Map Frage Allgemeine Java-Themen 10
H Generische Array Allgemeine Java-Themen 11
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
D generische Klasse für alle Maps (nicht Collections :-)) Allgemeine Java-Themen 11
D Methode für generische enummap/enum Allgemeine Java-Themen 10
B Generische Datentypen MergeSort Allgemeine Java-Themen 5
M Generische Klassen Allgemeine Java-Themen 3
M generische Listener Allgemeine Java-Themen 2
S Generische Typen: Frage dazu Allgemeine Java-Themen 11
H generische Klasse Realtion Allgemeine Java-Themen 2
T Ideenfindung: Generische Transportklasse? Allgemeine Java-Themen 3
C Generische Methode (Schablone) Allgemeine Java-Themen 8
G generische Klasse als Parameter einer generischen Klasse Allgemeine Java-Themen 5
leifg Rechenoperationen auf generische Datentypen Allgemeine Java-Themen 10
B Generische Typen instanzieren Allgemeine Java-Themen 11
R Generische Listener und Sender Allgemeine Java-Themen 12
M Generische Datentypen Allgemeine Java-Themen 14
F Viele generische Parameter sinnvoll? oder besser casten? Allgemeine Java-Themen 10
S Generische Methode Allgemeine Java-Themen 13
S Generische Methoden Allgemeine Java-Themen 7
D Statische, generische Methode will nicht. Allgemeine Java-Themen 2
Fynn29 Liste sortieren ohne Array und ohne vorgegebene Sortierung Allgemeine Java-Themen 24
MiMa Filtern von TableView Liste Allgemeine Java-Themen 2
B Liste aller Kombintionen mit Einschränkungen Allgemeine Java-Themen 8
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Liste ändern während Iteration über Diese? Allgemeine Java-Themen 16
D Erste Schritte Liste erweitern Allgemeine Java-Themen 11
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
L allgemein Strings händisch in Liste sortieren Allgemeine Java-Themen 47
M einfach verkettete Liste verstehen Allgemeine Java-Themen 23
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
Gaudimagspam Skip Liste erstellen in Java Allgemeine Java-Themen 3
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
bueseb84 Spring Boot Entity mit Liste Allgemeine Java-Themen 4
MiMa Werte in liste speichern? Allgemeine Java-Themen 3
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
K verkettete Liste Allgemeine Java-Themen 3
G Liste (UsageStats) sortieren (Android) Allgemeine Java-Themen 5
T Google Links in einer Liste Allgemeine Java-Themen 4
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
OSchriever Einfach verkettete Liste ändern Allgemeine Java-Themen 43
L Liste überschreibt alte Elemte Allgemeine Java-Themen 10
H Länge einer verketteten Liste Allgemeine Java-Themen 4
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
L Erste Schritte Liste von Datums filter nach Monate Allgemeine Java-Themen 4
Y Liste in Stream Packen Allgemeine Java-Themen 1
K Einfache Verkettete Liste mit Node Allgemeine Java-Themen 3
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
S Verkettete (Teil)Liste sortieren ( rekursiv bis n) Allgemeine Java-Themen 2
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
B Wie vergleiche ich Strings in einer Liste? Allgemeine Java-Themen 5
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
A Collections Inhalt einer Liste mit Inhalt anderer Liste vergleichen ? Allgemeine Java-Themen 7
I Abstrakte Datentypen - Liste Allgemeine Java-Themen 9
D Datentypen Klassenattribut aus Objekt in generischer Liste Allgemeine Java-Themen 15
P Liste zu Objekt umwandeln Allgemeine Java-Themen 4
Z In die Liste kann ich nichts adden Allgemeine Java-Themen 16
C Liste checken auf MINDESTENS ein Objekt | Bukkit Allgemeine Java-Themen 3
M liste von listen anders ausgeben Allgemeine Java-Themen 1
B Per Buttonklicks einer Liste Wörter hinzufügen - Wie umsetzen? Allgemeine Java-Themen 11
H Liste sortieren anhand optionalem Property Allgemeine Java-Themen 3
L Liste führt sich nicht weiter Allgemeine Java-Themen 5
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
B Prüfen, ob ein Element in der Liste nicht existiert Allgemeine Java-Themen 3
B Klassen JTable mit einer Liste Allgemeine Java-Themen 0
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1
A Auslesen einer Datei sowie ausgeben als Liste in App Allgemeine Java-Themen 5
E Liste löscht sich selbstständig Allgemeine Java-Themen 5
H Liste von Objekten generisch sortieren Allgemeine Java-Themen 0
D Liste anhand Standardnormalverteilung befüllen Allgemeine Java-Themen 1
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
T Datentypen Eine Liste - verschiedenen Klassen - eine Abstracte Klasse Allgemeine Java-Themen 3
M Werte aus DB in Liste speichern ohne mehrfach speicherung Allgemeine Java-Themen 18
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
O aus Liste ein beliebiges Element auswählen Allgemeine Java-Themen 7
J Liste aller Com-Ports - zweistellige Ports? Allgemeine Java-Themen 15
O MVC - wo Liste der ComboBox-Items ermitteln Allgemeine Java-Themen 3
MiMa Liste von Pfaden in eine textArea schreiben Allgemeine Java-Themen 7
K kontinuierlich aktuelle Bestellsystem-Liste mit farbigem Status Allgemeine Java-Themen 2
A Auswählbare Liste Allgemeine Java-Themen 2
D Sortieren von Liste zu unperformant Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben