+ Antworten
Ergebnis 1 bis 8 von 8

Thema: Erstes Interface nach Spezifikation "Haupt"interface?

  1. #1
    User Viertel Megabyte Themenstarter
    Avatar von TMII
    Registriert seit
    19.02.2015
    Fachbeiträge
    313
    Genannt
    31 Post(s)
    >> Klasse A implementiert die zwei Interfaces I1 und I2.
    >> Klasse B hat zwei Methoden .add( I1 i1 ); und .add( I2 i2 );

    Beim Aufruf von b.add( a ); nimmt der Compiler als Typ, von a, "I1" an.
    Um a auch als I2 hinzuzufügen muss ich aufrufen
    b.add( (I2) a );

    schreibe ich aber
    b.add( (I1) a );
    der Vollständigkeitshalber, gibt mir IntelliJ folgendes aus
    Casting 'a' to 'I1' is redundant
    Stimmt das? Ist das wirklich redundant?
    Redundant wäre es dann wenn die Spezifikation eindeutig das erste Interface als eine Art Hauptinterface festlegt.
    Geändert von TMII (06.12.2016 um 02:51 Uhr)
    Code:
    _/_/_/_/_/--_/------_/--_/_/_/--_/_/_/
    ---_/------_/_/--_/_/----_/------_/   
    --_/------_/--_/--_/----_/------_/    
    -_/------_/------_/----_/------_/     
    _/------_/------_/--_/_/_/--_/_/_/

  2. #2
    Global Moderator Floppy Disc
    Registriert seit
    30.07.2013
    Fachbeiträge
    839
    Genannt
    110 Post(s)
    Java unterstuetzt nur single dispatch: https://en.wikipedia.org/wiki/Multiple_dispatch#Java
    Maven is never completely installed

  3. #3
    Frequent User Halbes Megabyte
    Registriert seit
    31.07.2013
    Ort
    Hamburg
    Fachbeiträge
    551
    Genannt
    56 Post(s)
    Blog-Einträge
    2
    Ich find's in dem Zusammenhang eigentlich nicht redundant. Ist ja auch nur 'ne Warnung, kann man in IntelliJ ja vielleicht abstellen. Was dieser Fall aber sehr schön illustriert ist, warum überladen von Methoden nicht schön ist.

  4. Es bedanken sich:
    Timothy_Truckle (06.12.2016)
  5. #4
    Global Moderator Viertel Gigabyte
    Registriert seit
    05.08.2008
    Fachbeiträge
    4.905
    Genannt
    309 Post(s)
    Spontan (müßte ich da nochmal drüber nachdenken, aber... ) ich bin mir ziemlich sicher, dass die Frage angebracht ist: Stehen I1 und I2 in irgendeinem Verhältnis zueinander? (Und, für die Rosinenfreunde: Ist dieses Verhältnis ein anderes als "...hat nichts zu tun mit..." ? )

  6. Es bedanken sich:
    Timothy_Truckle (06.12.2016)
  7. #5
    User Viertel Megabyte Themenstarter
    Avatar von TMII
    Registriert seit
    19.02.2015
    Fachbeiträge
    313
    Genannt
    31 Post(s)
    Zitat Zitat von maki Beitrag anzeigen
    Java unterstuetzt nur single dispatch: https://en.wikipedia.org/wiki/Multiple_dispatch#Java
    Hätte dazu erwähnen sollen, dass ich beide Methoden hintereinander aufrufe
    Java Code:
    1. b.add( (I1) a );
    2. b.add( (I2) a );
    weil ich a sowohl als Typ von I2 als auch I1 in der Bibliothek hinzufügen möchte.
    Single dispatch ist mir bewusst, mich würde nur interessieren ob der erste Cast - nicht der Methodenaufruf - wirklich redundant ist wenn
    Java Code:
    1. class A implements I1, I2 {}

    Zitat Zitat von Marco13 Beitrag anzeigen
    Spontan (müßte ich da nochmal drüber nachdenken, aber... ) ich bin mir ziemlich sicher, dass die Frage angebracht ist: Stehen I1 und I2 in irgendeinem Verhältnis zueinander? (Und, für die Rosinenfreunde: Ist dieses Verhältnis ein anderes als "...hat nichts zu tun mit..." ? )
    Nein, es handelt sich um zwei unabhängige Interfaces ohne jegliche Beziehung zueinander.
    Normalerweise implementiert eine Klasse entweder I1 ODER I2.
    I1 und I2 sind im Algorithmus (Klasse B) absolute logische Gegenteile. Dachte mir aber es wäre mal interessant herauszufinden wie sich der Algorithmus verhält wenn eine Klasse (A) Beide implementiert und ich zwangsweise
    Java Code:
    1. b.add( (I1) a );
    2. b.add( (I2) a );
    aufrufe.
    Dabei ist mir die Warnung aufgefallen.

    Zitat Zitat von nillehammer Beitrag anzeigen
    Ich find's in dem Zusammenhang eigentlich nicht redundant. Ist ja auch nur 'ne Warnung, kann man in IntelliJ ja vielleicht abstellen. Was dieser Fall aber sehr schön illustriert ist, warum überladen von Methoden nicht schön ist.
    Ich denke in diesem Fall ist das Überladen okay weil nicht angedacht ist das ein und die selbe Klasse I1 und I2 implementiert. Das Verhalten ist unbekannt.
    Wirft aber auch keinen Fehler wenn...
    Ich denke auch das es nicht redundant ist, ein anderer Compiler könnte annehmen A ist vom Typ I2 beim Aufruf der Methode b.add( a );
    Code:
    _/_/_/_/_/--_/------_/--_/_/_/--_/_/_/
    ---_/------_/_/--_/_/----_/------_/   
    --_/------_/--_/--_/----_/------_/    
    -_/------_/------_/----_/------_/     
    _/------_/------_/--_/_/_/--_/_/_/

  8. #6
    Global Moderator Floppy Disc Avatar von Tomate_Salat
    Registriert seit
    30.07.2013
    Ort
    Durlach
    Fachbeiträge
    783
    Genannt
    151 Post(s)
    Blog-Einträge
    4
    Schwer hier was konkretes zu empfehlen ohne Kontext. Aber ich würde die Methoden umbenennen. Letztendlich klingt es für mich, als ob die zwei Methoden mit gleichem Namen unterschiedliche Arbeit machen. In dem Fall würde ich von Überladung abraten. Sieh die Methodennamen als Teil der Dokumentation an und in deinem Fall scheint sie eher verwirrend zu sein.
    byte-welt.net - das Forum von Programmierern für Programmierer

    Naming Conventions
    Erstes Interface nach Spezifikation "Haupt"interface?

    JMapper | Instant Note (App)

  9. #7
    Global Moderator Viertel Gigabyte
    Registriert seit
    05.08.2008
    Fachbeiträge
    4.905
    Genannt
    309 Post(s)
    Ich dachte erst, dass es mit meinem "Lieblingsabschnitt" aus der JLS zusammenhängen könnte: https://docs.oracle.com/javase/specs...#jls-15.12.2.5

    Aber wenn keine Beziehung zwischen I1 und I2 besteht, sollten entweder beide casts notwendig oder beide redundant sein - und ich würde sagen: Sie sollten beide notwendig sein. Andernfalls ist der Aufruf schlicht ambiguous: Es gibt ZWEI "potentially applicable methods", und kein Kriterium, nachdem entschieden werden kann.

    Das sagt auch folgendes MCVE im Javac:
    Java Code:
    1.  
    2. interface I1 {}
    3. interface I2 {}
    4.  
    5. class A implements I1, I2 { }
    6.  
    7.  
    8. class B
    9. {
    10.     public static void main(String args[])
    11.     {
    12.         B b = new B();
    13.         A a = new A();
    14.  
    15.         b.add(a);
    16.     }
    17.     public void add(I1 i1) { }
    18.     public void add(I2 i2) { }
    19. }

    Und IntelliJ nimmt da irgendwie den Aurfuf an? Aber spätestens beim Compilieren mit dem JavaC müßte es ihn doch raushauen...!?

  10. Es bedanken sich:
    TMII (07.12.2016)
  11. #8
    User Viertel Megabyte Themenstarter
    Avatar von TMII
    Registriert seit
    19.02.2015
    Fachbeiträge
    313
    Genannt
    31 Post(s)
    Zitat Zitat von Marco13 Beitrag anzeigen
    Und IntelliJ nimmt da irgendwie den Aurfuf an? Aber spätestens beim Compilieren mit dem JavaC müßte es ihn doch raushauen...!?
    Da sprichst du was an. Den Compiler hatte ich ja vor kurzem umgestellt.
    Zurück auf javac wird mir der selbe Fehler geworfen. IntelliJ beharrt weiter auf Redundanz, vielleicht verwendet es für die Warnings weiterhin einen anderen Compiler und ich hab vergessen irgendwo ein Häkchen zu machen oder es benötigt einen Neustart.
    Bis IntelliJ das Riesen-Projekt aber wieder geöffnet hat vergehen fast 20 Minuten deshalb wird das heute auch nix mehr, das erfahre ich dann morgen ;D

    Gut dann hat sich meine Frage beantwortet. Das ist nicht nach Spezifikation.
    Vielen Dank!
    Code:
    _/_/_/_/_/--_/------_/--_/_/_/--_/_/_/
    ---_/------_/_/--_/_/----_/------_/   
    --_/------_/--_/--_/----_/------_/    
    -_/------_/------_/----_/------_/     
    _/------_/------_/--_/_/_/--_/_/_/

+ Antworten Thema als "gelöst" markieren

Direkt antworten Direkt antworten

Wie lautet das letzte Wort am Ende dieser Webseite?

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 05.05.2015, 18:40
  2. (I/O) CSV einlesen - "unsichtbares" erstes Zeichen in der ersten Zeile
    Von Greta im Forum Java-Grundlagen
    Antworten: 6
    Letzter Beitrag: 24.01.2014, 13:57
  3. "Erstes Solar-Kraftwerk im Weltall geplant"
    Von L-ectron-X im Forum Technologie und Hardware
    Antworten: 3
    Letzter Beitrag: 20.06.2009, 20:03
  4. Java-Blog-Buch - "X) 04 Ein erstes Resümee"
    Von RSS Reader im Forum Java-Blog-Buch
    Antworten: 0
    Letzter Beitrag: 30.11.2008, 12:50
  5. "Erstes Feature Pack für Windows Vista"
    Von L-ectron-X im Forum Betriebssysteme
    Antworten: 0
    Letzter Beitrag: 23.04.2008, 10:37

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •