• Wir präsentieren Dir heute ein Stellenangebot für einen Frontend-Entwickler Angular / Java in Braunschweig. Hier geht es zur Jobanzeige

Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind

UnknownInnocent

UnknownInnocent

Bekanntes Mitglied
Hallo, ich habe folgende Frage: mit
Java:
public class CSVReader<L extends Label> {
...
}
bekomme ich ein L, das von Label abgeleitet ist oder das Label selbst. Was muss ich schreiben, dass ich nur die Klassen bekomme, die Label implementieren, aber nicht das Label selbst sind, also so nach dem Motto <L (L != Label) extends Label>? Danke!
 
UnknownInnocent

UnknownInnocent

Bekanntes Mitglied
Okay das ist doof, aber vlt kann mir anders geholfen werden.

Also ich habe folgende Struktur:
Ein interface Label:
Java:
public interface Label {
    String toString();

    double toDouble();

    /**
     * Separates numeric values from Label in String Array and returns a
     * {@link Sample} with the data from the array
     *
     * @param data the array containing the data that has not been separated yet
     * @return the {@link Sample} containing the data from the array
     * @throws IllegalArgumentException if there is not at least one numeric value
     *                                  and one Label in the array
     */
    <L extends Label> Sample<L> arrayToSample(String[] data) throws IllegalArgumentException;

    /**
     * returns a Label with value l
     *
     * @param l
     * @return Label
     */
    <L extends Label> L parseLabel(String l);

    static <L extends Label> L random() throws IllegalAccessException {
        throw new IllegalAccessException("May not call random() from super class");
    }

}

Und verschiedene Enums die Label implementieren, da alle gleich aufgebaut sind hier mal eines als Beispiel:
Java:
public enum BinaryLabel implements Label {

    POSITIVE, NEGATIVE;

    @Override
    public String toString() {
        switch (this) {
        case POSITIVE:
            return "POSITIVE";
        default:
            return "NEGATIVE";
        }
    }

    @Override
    public double toDouble() {
        switch (this) {
        case NEGATIVE:
            return 0d;
        default:
            return 1d;
        }
    }

    static BinaryLabel random() {
        return POSITIVE;
    }

    /**
     * returns a {@link BinaryLabel} with value l
     *
     * @param l
     * @return {@link BinaryLabel}
     */
    @Override
    @SuppressWarnings("unchecked")
    public BinaryLabel parseLabel(String l) {
        BinaryLabel label = BinaryLabel.POSITIVE;
        return (l.equals(label.toString()) ? BinaryLabel.POSITIVE : BinaryLabel.NEGATIVE);
    }

    /**
     * Separates numeric values from {@link BinaryLabel} in String Array and returns
     * a {@link Sample} with the data from the array
     *
     * @param data the array containing the data that has not been separated yet
     * @return the {@link Sample} containing the data from the array
     * @throws IllegalArgumentException if there is not at least one numeric value
     *                                  and one {@link BinaryLabel} in the array
     */
    @SuppressWarnings("unchecked")
    @Override
    public Sample<BinaryLabel> arrayToSample(String[] data) throws IllegalArgumentException {
        double[] values;
        BinaryLabel[] labelArr;
        for (int i = 0; i < data.length; i++) {
            try {
                Double.parseDouble(data[i]);
            } catch (Exception e) {
                if (i > 1) {
                    values = new double[i];
                    for (int j = 0; j < values.length; j++)
                        values[j] = Double.parseDouble(data[j]);
                } else
                    throw new IllegalArgumentException("Expected at least one numeric value.");

                labelArr = new BinaryLabel[data.length - values.length];
                if (labelArr.length > 0)
                    for (int j = 0; j < labelArr.length; j++)
                        labelArr[j] = parseLabel(data[j + values.length]);
                else
                    throw new IllegalArgumentException("Expected at least one label.");

                return new Sample<BinaryLabel>(labelArr, values);
            }
        }
        throw new IllegalArgumentException("Expected at least one label.");
    }

}

Und nun stehe ich vor folgendem Sachverhalt: Ich habe einen CSVReader, der wie der Name schon sagt, daten aus einer CSV-Datei einlesen soll.
Java:
public class CSVReader<L extends Label> {
...
    public SampleSet<L> read() throws IOException {
        SampleSet<L> data = new SampleSet<L>();
        String line = "";

        while ((line = br.readLine()) != null) {
            String[] values = line.split(STANDARD_SEPARATOR);
            data.add(??????.arrayToSample(values));
        }
       return data;
    }   
}

In dem Code habe ich die Stelle, an der es scheitert hervorgehoben. Wie mache ich es, dass immer die arrayToSample-Methode des jeweils übergebenen L aufgerufen wird?
 
D

DrPils

Bekanntes Mitglied
Welche Methode aufgerufen wird, hängt immer vom Objekt ab, nicht von dem Typ der Variablen (L).
Oder willst du auf was anderes hinaus?
 
UnknownInnocent

UnknownInnocent

Bekanntes Mitglied
Also ich müsste ja etwas machen wie
Java:
L label = new L();
l.arrayToSample(values);
Da sagt der mir, "Cannot instantiate type L" was ja auch Sinn macht, da man ja kein objekt von einem Enum erstellen kann. Meine Frage ist also, wie kann ich die Methode arrayToSample des jeweiligen L aufrufen?
 
D

DrPils

Bekanntes Mitglied
Dein L ist kein enum sondern ein generischer Typparameter, von denen kannst du auch kein Objekt erstellen. Deine Klasse braucht irgendwo her den Typ. Zb im Konstruktor
Java:
private T t;
public CSVReader(T obj){
 t = obj;
}
Du kannst das T natürlich auch bei Methoden als Parameter setzen.
So hättest du eine Instanz von T , aber ob das Sinn in deinem Code macht weiss ich nicht. Ich tue mich sehr schwer den zu verstehen
 
UnknownInnocent

UnknownInnocent

Bekanntes Mitglied
Vlt ist der Code auch schlecht geschrieben....
Ich versuche mal zu beschreiben, was der tun soll:
Ich habe den CSVReader, der liest eine CSV-Datei ein, die wie folgt aussieht:
Jede Zeile besteht aus mindestens einem numerischen Wert und mindestens einem String, der später in ein Label umgewandelt wird
Jetzt lese ich diese Datei Zeile für Zeile aus, wobei jede Zeile als String-Array ausgegeben wird. Jede Zeile soll nun zu einem Sample<L extends Label> gemacht werden, wobei dieses Sample im Konstruktor einen Vektor mit den Zahlen und ein Array mit Labels bekommt. Der Konstruktor von Vector sieht so aus: public Vector(double... data) Für diesen Vorgang, also StringArray -> Sample habe ich die Methode arrayToSample die in der Datei des jeweiligen Label-Enums zu finden ist. Da ich verschiedene Enums habe die Labels repräsentieren stellt sich mir die Frage, wie ich am Ende ein Label-Array vom richtigen Typ in mein Sample bekomme.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Der üblichste Weg dafür wäre, eine Factory für die konkrete Label-Klasse zu übergeben.
Also das arrayToSample nicht in der Label-Klasse zu haben, sondern in einer LabelFactory, von der es dann für jede Art Label eine Subklasse gibt. Eine Instanz der Factory kannst du dann dem CsvReader übergeben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
K Generics bei Klassen- und Interfacedeklarationen Java Basics - Anfänger-Themen 3
UnknownInnocent Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
G Generics Compilerfehler Java Basics - Anfänger-Themen 6
G Generics Methoden Java Basics - Anfänger-Themen 7
G Generics Java Basics - Anfänger-Themen 3
L Generics Tripel Java Basics - Anfänger-Themen 26
W Fragen zu Generics Java Basics - Anfänger-Themen 14
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
X Wie Generics richtig benutzen ? Java Basics - Anfänger-Themen 5
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
I Java Generics factory method Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
I Generics und Comparable Java Basics - Anfänger-Themen 14
G Generics mit ? und Diamantoperator Java Basics - Anfänger-Themen 4
G Generics: Wildcard ? Java Basics - Anfänger-Themen 12
D Generics methode Java Basics - Anfänger-Themen 2
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
W Generics - Typ zurückbekommen Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Generics von Profis leicht erklärt Java Basics - Anfänger-Themen 7
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
J Collections Generics: Typ wird nicht erkannt Java Basics - Anfänger-Themen 7
D Generics ArrayList: Bug im Quellcode Java Basics - Anfänger-Themen 14
C Generics Java Basics - Anfänger-Themen 8
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
T Generics in Java... Java Basics - Anfänger-Themen 9
J Generics Java Basics - Anfänger-Themen 3
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
O Generics - Implementierung Java Basics - Anfänger-Themen 7
Shizmo Frage zu Generics Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
H Typsicherheit/Generics Java Basics - Anfänger-Themen 1
U Java generics funktioniert nicht Java Basics - Anfänger-Themen 0
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Generics Java Basics - Anfänger-Themen 4
R Compiler-Fehler Generics Problem Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
D toArray und Generics Java Basics - Anfänger-Themen 2
D Zwei Generics beim Überladen von Methoden Java Basics - Anfänger-Themen 3
C Erste Schritte Filter für Generics oder ähnliches Java Basics - Anfänger-Themen 2
M Frage zu Generics-Deklaration Java Basics - Anfänger-Themen 5
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
J Java Generics - Frage zu Types Java Basics - Anfänger-Themen 2
M <T> Generics Java Basics - Anfänger-Themen 7
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
T Polymorphie Generics-Problem Java Basics - Anfänger-Themen 2
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
J Array Generics Java Basics - Anfänger-Themen 3
J Generics casten Java Basics - Anfänger-Themen 14
J Generics wildcard Java Basics - Anfänger-Themen 6
E Listen und Generics Java Basics - Anfänger-Themen 9
X Generics Java Basics - Anfänger-Themen 6
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
M OOP Mit Generics auf Methoden zugreifen? Java Basics - Anfänger-Themen 10
S Generics Java Basics - Anfänger-Themen 4
G Generics kein Zugriff auf getter eines Objekts Java Basics - Anfänger-Themen 4
L Datentypen Problem mit Generics und null Java Basics - Anfänger-Themen 6
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
W Interface Problem mit Generics Java Basics - Anfänger-Themen 2
M OOP Generics und Wildcards Java Basics - Anfänger-Themen 3
D Generics - Warnmeldungen Java Basics - Anfänger-Themen 2
M Polymorphie generics einsteigerprobleme Java Basics - Anfänger-Themen 3
D Vererbung Generics und Vererbung Java Basics - Anfänger-Themen 8
C Generics Array Java Basics - Anfänger-Themen 43
D Fehler mit generics Java Basics - Anfänger-Themen 10
S Generics - CaseInsensitiveMap selber schreiben? Java Basics - Anfänger-Themen 5
K Datentypen Generics Java Basics - Anfänger-Themen 3
P Comparable und Generics Java Basics - Anfänger-Themen 6
I Generics (Subtypen) Java Basics - Anfänger-Themen 17
N Typeinschränkung bei Generics Java Basics - Anfänger-Themen 13
C Generics und Cast Java Basics - Anfänger-Themen 5
H Generics werden in -source 1.2 nicht unterstützt Java Basics - Anfänger-Themen 16
M Datentypen Generics: Exacten Typ ermitteln Java Basics - Anfänger-Themen 6
N Generics und Interfaces Java Basics - Anfänger-Themen 5
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
lumo Java Generics Java Basics - Anfänger-Themen 19
M verlinkte Liste mit generics Java Basics - Anfänger-Themen 7
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
S Generics und Typerkennung Java Basics - Anfänger-Themen 7
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
B Java Listen und Generics Java Basics - Anfänger-Themen 35
O Abstract Method & Generics Java Basics - Anfänger-Themen 10
K Aufgabe Generics Java Basics - Anfänger-Themen 10
L Generics und vererbung Java Basics - Anfänger-Themen 3
M Java Generics LinkedList Java Basics - Anfänger-Themen 5
C Generics Java Basics - Anfänger-Themen 12
B Multiplikation bei Generics Java Basics - Anfänger-Themen 9
C Generics Java Basics - Anfänger-Themen 8
M Generics - "Unchecked cast"-Warnung wegbekommen Java Basics - Anfänger-Themen 4
B Generics Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Anzeige

Neue Themen


Oben