Frage zu Interface und List

brOOper

Neues Mitglied
angenommen, ich habe folgenden code:

IFace.java:
Java:
public interface IFace {}

MyClass.java:
Java:
public class MyClass extends IFace {}

MyTest.java:
Java:
import java.util.List;

public class MyTest {

  private MyClass myClass; 
  private List<MyClass> myClasses;

  public IFace test1() {
    return myClass;
  }

  public List<IFace> test2() {
    return myClasses;
  }

}

wieso funktioniert die methode test1, test2 aber nicht?
 
ah, eines meiner Lieblingsthemen,

würde es funktioniren, hätte der Aufrufer von test2() eine normale List<IFace> vorliegen,
in die er wie es so üblich ist, beliebige IFace-Objekte einfügen könnte, auch die die nicht vom Typ MyClass sind,

diese Liste wird in MyTest immer noch als List<MyClass> angesehen, dort könnte also ein Aufruf
> MyClass x = myClasses.get(2);
stehen, und was passiert wohl, wenn an dieser Stelle ein anderes IFace-Objekt drin ist, welches nicht vom Typ MyClass ist?

genau, BOOM

------

möglich ist dagegen, List<? extends IFace> zurückzugeben,
abgesehen von der ekligen Syntax ist dann für den Aufrufer das Einfügen verboten, um diesen Fehler zu verhindern

edit:
knapp gewonnen 😉
 
Java:
public class MyOtherClass /* also */ extends IFace {}

public class MyTest {
 
  private MyClass myClass; 
  private List<MyClass> myClasses;
 
  public IFace test1() {
    return myClass;
  }
 
  public List<IFace> test2() {
    return myClasses;
  }


  public void doSomething()
  {
      // Ich weiß ja, das hier nur Objekte vom Typ "MyClass" drin sind. 
      // Schließlich ist das ja eine List<MyClass>.
      MyClass m = myClasses.get(0);
  }
 
}

class BadGuy
{
    void doSomethingBad()
    {
        MyTest test = new MyTest();
        IFace iface = new MyOtherClass();
        test.test2().add(iface); // Ist erlaubt, schließlich ist das ja eine List<IFace>...

        test.doSomething(); // *Knirsch*
    }
}

Kurz: Die Typsicherheit ginge verloren.

EDIT: *grummel* Dafür mit Beispiel 😛ueh: 😉
 
Zuletzt bearbeitet:
Ich würde an deiner Stelle in MyTest garnicht MyClass angeben, sondern immer nur IFace. Sonst hast du nachher eventuell Probleme mit eventuellen typecasts
 

Zurück
Oben