Vererbung Generics - mal wieder die verhaßte Rückwärtskompatibilität

Mahlzeit

Mir machen Generics mal wieder Ärger. Folgendes Problem:
Java:
@ForceDeclaredGenerics //Annotation von mihe: [URL]https://www.java-forum.org/thema/generics-vererbung.185397/[/URL]
public abstract SuperClass<T, U, V, W>{
    //Some methods...
   
    public ArrayList<IWantToHaveThisClassReturn> getAnArrayList(){
       
    }
}
Soweit, so schön. Jetzt foppt mich der Compiler:
Java:
public class InheritedFromSuperClass extends SuperClass<1Class, 2Class, 3Class, 4Class>{
    //Some methods...
}

public static main{
    ArrayList<IWantToHaveThisClassReturn> list;
    InheritedFromSuperClass problemClass = new InheritedFromSuperClass();
   
    list = getAnArrayList(); //Compiler: Incompatible types: Object cannot be converted to IWantToHaveThisClassReturn
}
Die Deklaration des Arrays hat nichts mit den Generics zu tun. Der Rückgabetyp ändert sich nicht. Ich könnte das jetzt jedesmal hin und hercasten, aber das ist gefällt mir gar nicht. Hat jemand eine Idee, wie ich das fixen kann? An mihe7s Annotationsprozessor liegt es übrigens nicht, der Compiler meckert auch ohne AP. (Und wenn man das ohne AP lösen kann, wäre das prima.)

Hat sich da eigentlich was seit Java8 getan? Wenn das Problem in Java12 behoben wurde würde ich mir ernstlich die Mühe machen und wechseln.
 
Es würde sehr helfen, wenn du überhaupt erstmal anderweitig kompilierenden Code als Snippet postest.
Der Code, den du gepostet hast, hat noch einige weitere Compilerfehler.
1. `public abstract SuperClass` sollte wohl `public abstract class SuperClass` sein
2. Die Signatur von `main` ist schräg (kein Rückgabetyp und keine Parameterklammern) - ich nehme mal an, du meinst die Standard `main` Method hier
3. `list = getAnArrayList();` <- worauf rufst du denn hier `getAnArrayList()` auf? auf `problemClass`?

Ich vermute mal, dass du das hier meinst:
Java:
import java.util.ArrayList;
class IWantToHaveThisClassReturn {
}
abstract class SuperClass<T, U, V, W> {
  public ArrayList<IWantToHaveThisClassReturn> getAnArrayList() {
    return null;
  }
}
public class InheritedFromSuperClass extends SuperClass<Integer, Integer, Integer, Integer>{
  public static void main(String[] args){
    ArrayList<IWantToHaveThisClassReturn> list;
    InheritedFromSuperClass problemClass = new InheritedFromSuperClass();
    list = problemClass.getAnArrayList(); // <- funktioniert doch?
  }
}
(Integer hab ich hier als Beispiel Typargumente verwendet, damit das erstmal kompiliert)
 
Jap, da hab ich mich tatsächlich vertippt. Hier das reale Problem:
Java:
@ForceDeclaredGenerics //Der mihe7sche AP
public abstract class RowTable<
        CHT extends ColumnHeader,
        RHT extends RowHeader,
        RT extends Row,
        RMT extends RowModel,
        IT extends Itemable,
        RHMT extends RowheaderModel,
        CHMT extends ColumnheaderModel,
        IMT extends ItemModel> {
          
        //...
          
    public ArrayList<Identifier> getRowIdentifier() {
        return (ArrayList<Identifier>) rowOrder.clone();
    }
}


@ForceDeclaredGenerics //Der mihe7sche AP
class ExtendedRowtable extends RowTable<
        ExtendedColumnHeader,
        ExtendedRowHeader,
        ExtendedRow,
        ExtendedRowmodel,
        RowtableItem,
        ExtendedRowheaderModel,
        ExtendedColumnheaderModel,
        ExtendedItemmodel>{

    public ExtendedRowtable() {
    }
}

@Test
    public void testGetRow() {
        RowTable instance;
        ExtendedRow row;
        Identifier i;
        Row result, expResult;
      
        System.out.println("getRow");
      
        instance = new ExtendedRowtable();
        row = new ExtendedRow();
        instance.addRow(row);
        i = instance.getRowIdentifier().get(0); //<- Funktioniert leider nicht :(
      
        expResult = row;
        result = instance.getRow(i);
        assertSame(expResult, result);
    }
Die Klasse hat bis vorhin funktioniert, da war RowTable allerdings noch nicht abstrakt. Das muß für eine weitere Implementierung jedoch leider sein. :(

Edit:
Ich hab den Fehler gefunden. Der Test muß lauten:
Java:
@Test
    public void testGetRow() {
        ExtendedRowtable instance; //<- Fehler war hier: falsche Deklaration (Relikt aus der vorherigen Implementierung)
        ExtendedRow row;
        Identifier i;
        Row result, expResult;
       
        System.out.println("getRow");
       
        instance = new ExtendedRowtable();
        row = new ExtendedRow();
        instance.addRow(row);
        i = instance.getRowIdentifier().get(0);
       
        expResult = row;
        result = instance.getRow(i);
        assertSame(expResult, result);
    }
Vielen Dank dennoch fürs drüberschauen. :)
 
Zuletzt bearbeitet:
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben