Interface-Problem

Status
Nicht offen für weitere Antworten.

gee_20_4_7

Mitglied
Hallo Java-Freunde,

ich habe gerade folgendes Problem:
-es gibt ein Interface I, welches für die Klassen A,B,C,D,E als Vertrag gilt
-es gibt in einer Klasse Z eine List<I>, welche Objekte der obigen Klassen speichert
-es gäbe die Möglichkeit ein Enum als Parameter zur Verfügung zu stellen, welches angibt welcher Art die Ergebnis - Liste sein soll

Nun soll ich in Klasse Z eine Möglichkeit zur Verfügung stellen getypte Listen abzufragen.
Dieser Form: List<A> oder List<B> und so weiter.

Die einfache Variante 5 Methoden mit annähernd gleichem Code zu schreiben ist mir klar. Gibt es vielleicht auch eine Möglichkeit das alles in einer Methode abzuhandeln? Mittels Polymorphie oder ähnlichem?
Habe jetzt schon einiges probiert - bin aber immer wieder gescheitert, weil sich der generische Typ der Liste erst zur Laufzeit ergibt...

Danke schon mal im Voraus.
 

faetzminator

Gesperrter Benutzer
Es gäbe da instanceof, aber das find ich nicht sehr hübsch:
Java:
if (someObj instanceof A) {
    // do something ...
} else if (someObj instanceof B) {
    // ...
} // ...
aber eine Methode im Interface wär natürlich schon schön, warum hast du sonst das Interface?
 

gee_20_4_7

Mitglied
Danke für die zügige Antwort,

Die herangehensweise mit dem InstanceOf-Operator habe ich tatsächlich noch nicht probiert, aber ich denke, da werde ich wieder das gleiche Problem bekommen, wie bei meinen Versuchen vorher, denn es entscheidet sich ja erst nach Auswertung der Bedingungen welche Art Liste zurückgegeben werden soll. Gibt es da irgendwas, oder muss ich den hässlichen Weg gehen?

Das Interface habe ich aus Gründen der Erweiterbarkeit. Dort hängen ähnliche Klassen dran, die aber trotzdem manchmal auch getrennt behandelt bzw. benutzt werden müssen.
Wie meinst du das mit der Methode im Interface?

Gruß
 
Java:
public <E extends I> List<E> getValues(Class<E> type)
{
  final List<E> result=new ArrayList<E>();
  for(I value : yourList)
  {
    //hier gibt es viele Möglichkeiten, hier eine wenn wirklich nur Instanzen von A, B usw im result sein sollen
    if(type.equals(value.type))
    {
       result.add((E)value);
    }
  }
  return result;
}
 

faetzminator

Gesperrter Benutzer
ja, ich wär zb für ein
Java:
public final int type;
im interface, dann könntest du in den Konstruktoren der Klassen z.B. folgendes machen
Java:
public A() {
    type = THIS_IS_SOME_CONSTANT;
}
und dann für die Typisierung:
Java:
switch (someObj.type) {
case THIS_IS_SOME_CONSTANT:
    // ...
    break;
case [...]
default:
    throw new IllegalArgumentException();
}
 

gee_20_4_7

Mitglied
Oh das sieht sehr interessant aus... Werde ich gleich mal probieren!
Das extends gilt wohl auch für Interfaces, nicht nur für Basisklassen?
thx
 

Noctarius

Top Contributor
Genau auch Interfaces kannst du ableiten (sogar Annotation-Interfaces um es genau zu sagen *gg*).

<E extends I> sagt, dass der Rückgabetyp eine Ableitung vom Interface I sein muss.
 

gee_20_4_7

Mitglied
Also ich habe es jetzt folgendermaßen gemacht:

Java:
 @SuppressWarnings("unchecked")
    public <E> List<E> getGetypteListe(final Class<E> type) {
	List<E> result = new LinkedList<E>();
	for (I i : theList) {
	    if (type.equals(i.getClass())) {
		result.add((E) i);
	    }
	}
	return result;
    }
Muss ich mir wegen der SuppressWarning Gedanken machen?
Hab da schon einiges gelesen - oft hieß es "geht nicht anders". Ist das richtig?

Nochmal zu dem extends im Platzhalter der von Käptn Blaubär angebotenen Parametrisierten Methode:
Das extends habe ich rausgenommen, weil es um Objekte geht, die nur das Interface implementieren und nicht um Objekte vom Interface abgeleiteter Klassen. Aber trotzdem großen Dank für den Ansatz!!!

Getestet habe ich die Methode schon - und sie funzt. Gibt es da noch irgendwelche Einwände?

@faetzminator:
Auch großen Dank an dich!
Das mit dem typeAttribut habe ich auch probiert... Wusste gar nicht, dass man in einem Interface Attribute angeben kann. Dieses sollte nur immer initialisiert werden und darum habe ich das verworfen. Konnte ja, da es sich um ein finales Attribut handelte, diesem auch nichts mehr zuweisen. Oder, wie meintest du das?

@Noctarius
<E extends I> sagt, dass der Rückgabetyp eine Ableitung vom Interface I sein muss.
Wenn eine Klasse ein Interface implementiert handelt es sich aber nicht um eine Ableitung, oder habe ich da was überhört???

Gruß
 
Zuletzt bearbeitet:

gee_20_4_7

Mitglied
Wenn das mit dem Interface nicht funktioniert, dann versuchs mit einer astrakten Klasse

Das wär dann schon sinnvoller denke ich auch, aber dann würde ich zuviel ändern müssen, und mir Feinde im Projekt machen :D. Aber nochmal vielen Dank für die schnellen Antworten.

Was sagst du zu der von mir angebotenen Variante? Sollte doch OK sein, oder?

Gruß
 

SchonWiederFred

Bekanntes Mitglied
Vorsicht, das extends in den spitzen Klammern hat eine andere Bedeutung als das extends was Du sonst so kennst. <E extends I> bedeutet NICHT, dass E eine Subklasse einer Klasse I ist. Das extends heißt in diesem Zusammenhang viel mehr "E ist ein Subtyp von I".
 

Landei

Top Contributor
Dumme Frage: Warum trennst du die Elemente nicht schon beim Einfügen?

Aus'm Kopp - ohneGewähr:
Java:
class Z {
   private Map<Class<? extends I>,List<I>> map = new HashMap <Class<? extends I>,List<I>>();

   public void add(I i) {
      Class<? extends I> clazz = i.getClass();
      List<I> list = map.get(clazz);
      if (list == null) {
          list = new ArryList<I>();
          map.put(clazz, list);
      } 
      list.add(i);
   }

   public List<I> getList(Class<? extends I> clazz) {
       return map.get(clazz);
   }
}
 

gee_20_4_7

Mitglied
Also nochmal ein großes Danke an alle.
Verblüfft hat mich, dass extend in den eckigen Klammern beides heißt, aber ok, kann man sich merken. Die Variante von Landei ist der absolute Hammer -> Da muss man erstmal drauf kommen! Werde die Variante mal vorschlagen.
Jetzt würde ich gerne noch eines wissen wollen. Wie sieht es mit einer Implementation aus (denke, dass es sich immer um Casts handelt), die eine "Suppress Warning" fordert/wirft/ausgibt :). Sollte man das vermeiden? Gibts da Möglichkeiten, drum herum zu kommen, oder kann man das stehen lassen, ohne vom "Chef" eins auf den Deckel zu bekommen?
 

Lexi

Bekanntes Mitglied
Verblüfft hat mich, dass extend in den eckigen Klammern beides heißt, aber ok, kann man sich merken.

Da Generics erst später eingeführt worden sind, ich glaube mit Java 5, wollte sun die Kreation von neuen "Schüsselwörtern" ( oder wie man das nennt ) verhindern, damit man keinen alten Code kaputtmacht.
 

gee_20_4_7

Mitglied
OK, dann danke ich nochmal allen die mir hier helfend bei Seite standen!
Und deklariere wenn auch nur verbal, oder geht das hier irgendwie anders, den Thread als geschlossen.

THX a lot
 

Noctarius

Top Contributor
btw noch einmal am Ende:
das extends steht nicht in eckigen Klammern "[]" sondern in spitzen Klammern "<>" :D
 

Noctarius

Top Contributor
Ist ja nicht schlimm, wollts nur sicherheitshalber noch mal richtig stellen falls es mal irgendwann wer anders ließt =)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Interface Interface Comparable Problem... Java Basics - Anfänger-Themen 2
B OOP Problem bei Implementierung von Interface Java Basics - Anfänger-Themen 6
S Programmstruktur mit Interface problem Java Basics - Anfänger-Themen 3
S problem mit sortierung interface comperator Java Basics - Anfänger-Themen 11
kulturfenster Problem mit Thread + Interface Java Basics - Anfänger-Themen 4
G generic interface problem Java Basics - Anfänger-Themen 12
I No Jakarta Enterprise Beans found with interface ignorieren? Java Basics - Anfänger-Themen 2
I No EJB found with interface of type Java Basics - Anfänger-Themen 12
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Abstrakt oder Interface Java Basics - Anfänger-Themen 3
Say public/default Interface Java Basics - Anfänger-Themen 9
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
I Browser integriert in Desktop Applikation - Webcam interface not found Java Basics - Anfänger-Themen 26
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
D Interface Verständisfrage Java Basics - Anfänger-Themen 8
U Interface | constructor injection Java Basics - Anfänger-Themen 5
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
T Interface Map und Map.Entry Java Basics - Anfänger-Themen 4
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
I JSON und Interface Java Basics - Anfänger-Themen 3
Kotelettklopfer Kleines Testprogramm mit Interface und einer Usereingabe Java Basics - Anfänger-Themen 16
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
L Interface & Comparable Java Basics - Anfänger-Themen 15
T Interface Java Basics - Anfänger-Themen 0
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
A Interface Kuddelmuddel Java Basics - Anfänger-Themen 4
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
H abstract und interface Java Basics - Anfänger-Themen 4
F Interface Casting Java Basics - Anfänger-Themen 13
C Telefonliste mit interface implementieren Java Basics - Anfänger-Themen 30
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
H Interface Java Basics - Anfänger-Themen 2
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
B Interface vs Abstract Java Basics - Anfänger-Themen 2
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
pkm Interface Funktionales Interface lässt sich nicht implementieren. Java Basics - Anfänger-Themen 2
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
J OOP Wie sollte ich das organisieren (Abstract? Interface?) Java Basics - Anfänger-Themen 33
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
E Interface nur von abstrakter Klasse implementierbar?! Java Basics - Anfänger-Themen 1
J Vererbung Abstrake Klasse <-> Interface Java Basics - Anfänger-Themen 5
C Interface als Datentyp eines Attributes? Java Basics - Anfänger-Themen 6
U Interface Bedeutung "Code to an interface rather than to an implementation." Java Basics - Anfänger-Themen 4
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
M Maven Main-Methode Interface und Klasse Java Basics - Anfänger-Themen 2
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
D Interface Amazon Skill Kit, Interface but method in other class? Java Basics - Anfänger-Themen 3
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
N Interface Interface Erstellung Java Basics - Anfänger-Themen 3
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
Azazel Ist die abstract class das selbe wie ein interface ? Java Basics - Anfänger-Themen 33
K Interface: wie damit arbeiten Java Basics - Anfänger-Themen 4
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
T Vererbung Interface Java Basics - Anfänger-Themen 5
F Interface aus anderem Package nutzen Java Basics - Anfänger-Themen 10
N Interface Daten einem Implementierten Interface zuweisen Java Basics - Anfänger-Themen 37
B Erste Schritte Wie definiere ich in Java ein Interface? Java Basics - Anfänger-Themen 6
L OOP Interface Prinzip? Java Basics - Anfänger-Themen 6
K Nutzung einer Klasse die das Iterator-Interface implementiert Java Basics - Anfänger-Themen 0
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
J Innerhalb Interfacemethode: Interface als Attribut Java Basics - Anfänger-Themen 2
A Frage zu Interface Java Basics - Anfänger-Themen 16
J Interface Java Basics - Anfänger-Themen 3
W Interface Java Basics - Anfänger-Themen 1
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
Shams Kann man von einem Interface aus auf die dieses implementierende Klasse zugreifen? Java Basics - Anfänger-Themen 4
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
J Frage zu dem Thema interface Java Basics - Anfänger-Themen 5
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
S Interface-Methode abrufen? Java Basics - Anfänger-Themen 2
G Vererbung Klasse erbt von abstrakter Klasse implementiert Interface Java Basics - Anfänger-Themen 2
M Konstanten in einem Interface definieren Java Basics - Anfänger-Themen 1
P interface Java Basics - Anfänger-Themen 1
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1

Ähnliche Java Themen


Oben