Generische Objekt Instanz erstellen

Diskutiere Generische Objekt Instanz erstellen im Java Basics - Anfänger-Themen Bereich.
Kirby_Sike

Kirby_Sike

Könnte mir jemand erklären wie ich eine Instanz zu einem generischen Objekt erstelle? Beispielsweise für die folgende Klasse:

Java:
public class Node <T> {

    private T data;
    private Node <T> next;
    
    public Node(T dataValue){
        this.data = dataValue;
        this.next = null;
    }
    
    public void setNext(Node <T> next) {
        this.next = next;
    }
    
    public Node <T> getNext(){
        return next;
    }
    
    public T getData() {
        return data;
    }
    
    @Override
    public String toString() {
        return "[" + data + "] ";
    }
}
 
J

JustNobody

Die Klasse ist generisch, die Instanz dann nicht mehr. Also wenn Du eine Instanz brauchst, dann musst Du Dich festlegen.

Also Dein Node<T> ist so wie ArrayList<T> und co, also kannst Du ebenso nutzen:
Java:
// Generische ArrayList Klasse nutzen für z.B. String:
ArrayList<String> myList = new ArrayList<String>();

// Nun geht das mit Deinem Node ebenso:
Node<String> myNode = new Node<String>();
Wobei es ausreicht, wenn Du den Typ einmal festlegst, also z.B. bei Deinem Node:
Java:
Node<String> myNode = new Node<>();
 
Kirby_Sike

Kirby_Sike

Die Klasse ist generisch, die Instanz dann nicht mehr. Also wenn Du eine Instanz brauchst, dann musst Du Dich festlegen.

Also Dein Node<T> ist so wie ArrayList<T> und co, also kannst Du ebenso nutzen:
Java:
// Generische ArrayList Klasse nutzen für z.B. String:
ArrayList<String> myList = new ArrayList<String>();

// Nun geht das mit Deinem Node ebenso:
Node<String> myNode = new Node<String>();
Wobei es ausreicht, wenn Du den Typ einmal festlegst, also z.B. bei Deinem Node:
Java:
Node<String> myNode = new Node<>();
Also wenn ich jetzt eine Methode in meiner „List“ Datenstruktur erstellen so wie folgt:


Java:
public void add(Node <T> before){
Node <T> newNode = new Node <T>();
}
Wäre das richtig?
 
C

CSHW89

Ergänzend dazu, da der Konstruktor ein Objekt der Klasse T verlangt, muss dieser übergeben werden. Der Typ steht aber an dieser Stelle fest:
Java:
Node<MeineKlasse> node1 = new Node<>(new MeineKlasse());
Node<String> node2 = new Node<>("Test");
Das Instantiieren von "data" in der Node-Klasse geht nicht. Also sowas wie
Java:
data = new T()
ist nicht erlaubt.
 
Kirby_Sike

Kirby_Sike

Ergänzend dazu, da der Konstruktor ein Objekt der Klasse T verlangt, muss dieser übergeben werden. Der Typ steht aber an dieser Stelle fest:
Java:
Node<MeineKlasse> node1 = new Node<>(new MeineKlasse());
Node<String> node2 = new Node<>("Test");
Das Instantiieren von "data" in der Node-Klasse geht nicht. Also sowas wie
Java:
data = new T()
ist nicht erlaubt.
So habe es zum laufen bekommen, Dankeschön :)
 
Kirby_Sike

Kirby_Sike

Aaaaaaaaaaaalso...Ich habe jetzt eine Klasse Liste geschrieben(Die Datenstruktur) und eine Klasse Node(Die einzelnen Knoten in der Datenstruktur). Ich hatte versucht Dinge einzulesen und in die Liste zu speichern, wenn man keine Eingaben mehr tätigen möchte, wird die Liste ausgegeben. Mein Problem hierbei ist, dass die Ausgabe in einer endlos Schleife endet xD Ich verstehe nicht ganz was falsch an der Abbruchbedingung ist :)

Hier sind meine 3 Dateien:

Java:
public class Node <T> {

    private T data;
    private Node <T> next;
    private Node <T> previous;
  
    public Node(T dataValue){
        this.data = dataValue;
        this.next = null;
        this.previous = null;
    }
  
    public void setNext(Node <T> next) {
        this.next = next;
    }
  
    public Node <T> getNext(){
        return next;
    }
  
    public void setPrevious(Node <T> previous) {
        this.previous = previous;
    }
  
    public Node<T> getPrevious(){
        return previous;
    }
  
    public T getData() {
        return data;
    }
  
    @Override
    public String toString() {
        return "[" + data + "] ";
    }
}
Java:
public class List <T> {

    private Node <T> front;
    private Node <T> rear;
  
    public List() {
        front = null;
        rear = null;
    }
  
    public void add(Node <T> before, T data) throws InstantiationException, IllegalAccessException{
        if(before == null) {
            System.out.println("Du kannst nach einem null nichts einfügen!");
            return;
        }
        Node <T> newNode = new Node<T>(data);
        newNode.setNext(before.getNext()); //Setze den next der neuen Node auf den Nachfolger
        before.getNext().setPrevious(newNode); //Setze das previous der neuen Node auf die neue Node
        before.setNext(newNode);  //Setze die neue Node als Nachfolger der vorherigen Node
        newNode.setPrevious(before); //Setze den Vorgänger der neuen Node
      
    }
  
    public void addFront(T data) throws InstantiationException, IllegalAccessException{
        Node <T> newNode = new Node<T>(data);
        newNode.setNext(front);
        newNode.setPrevious(null);
        front = newNode;
      
    }
  
    public void addRear(T data) throws InstantiationException, IllegalAccessException{
        Node <T> newNode = new Node<T>(data);
        newNode.setPrevious(rear);
        newNode.setNext(null);
        rear = newNode;
  
    }
  
    public void printList() {
        for(Node<T> it = front; it != null; it.getNext()) {
            System.out.println(it.toString());
        }
    }
  
    public boolean isEmpty() {
        return front == null && rear == null;
    }
  
    public void setFront(Node <T> front){
        this.front = front;
    }
  
    public Node<T> getFront(){
        return this.front;
    }
  
    public void setRear(Node <T> rear){
        this.rear = rear;
    }
  
    public Node<T> getRear(){
        return this.rear;
    }
}
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ListTester {
    private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) throws IOException{
        List <String> s = new List<String>();
        boolean check = true;
        while(check) {
            int temp = readIntegers();
            switch(temp) {
            case 1:
                System.out.println("Geben sie den Input ein: ");
                String l = in.readLine();
                try {
                    s.addFront(l);
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                break;
            }
          
            System.out.println("Wollen sie eine weitere eingabe tätigen?");
            if(in.readLine().equals("nein")) {
                check = false;
                System.out.println("Liste wird ausgegeben...");
                try {
                    Thread.sleep(1500);
                } catch (InterruptedException e) {
                    System.out.println("Thread Sleep failed!");
                    e.printStackTrace();
                }
                s.printList();
            }
          
        }
      

    }
  
    private static Integer readIntegers() {
        try {
            int result = Integer.parseInt(in.readLine());
            return result;
        }catch(Exception e) {
            System.out.println("Das ist keine Zahl");
        }
        return null;
    }

}
 
VfL_Freak

VfL_Freak

Moin,

mal ins Blaue geraten: meinst du dies hier?
Java:
System.out.println("Wollen sie eine weitere eingabe tätigen?"); 
if(in.readLine().equals("nein")) 
{ // ...
* kommt denn der erste SysOut??
* dumm gefragt: gibst Du dann wirklich 'nein' ein (klein geschrieben etc.)??

VG Klaus
 
Kirby_Sike

Kirby_Sike

Moin,

mal ins Blaue geraten: meinst du dies hier?
Java:
System.out.println("Wollen sie eine weitere eingabe tätigen?");
if(in.readLine().equals("nein"))
{ // ...
* kommt denn der erste SysOut??
* dumm gefragt: gibst Du dann wirklich 'nein' ein (klein geschrieben etc.)??

VG Klaus
Daran liegt es nicht ;) Er geht bis zum Thread Sleep und Printet auch die Liste, nur halt unendlich lange...was nicht ganz meine Intention war xd

Zu deiner Frage:

Ja, ich gebe "nein" (<--- genau so) ein und es wir auch der Sysout geprintet.


Meine sehr sehr wage Vermutung....Ich fange beim Print irgendeine Exception nicht ab xD
 
J

JustNobody

Ist doch klar:
Java:
for(Node<T> it = front; it != null; it.getNext())
Was macht denn nur das it.getNext()?

Da it nicht verändert wird, ist dies eine Endlosschleife, so it am Anfang nicht auf null gesetzt wird.
 
Kirby_Sike

Kirby_Sike

Ist doch klar:
Java:
for(Node<T> it = front; it != null; it.getNext())
Was macht denn nur das it.getNext()?

Da it nicht verändert wird, ist dies eine Endlosschleife, so it am Anfang nicht auf null gesetzt wird.
Ohh ok... Ich hatte mir halt folgendes dabei gedacht:

Ich möchte das bei jeder Iteration das it die Referenz des nächsten Objekts enthält und das letzte Objekt der Liste zeigt auf null, dort soll die Schleife dann abbrechen.
 
Thema: 

Generische Objekt Instanz erstellen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben