2017-07-13 6 views
0

Ich kann mich im Moment nicht umdrehen, vielleicht ist das eine dumme Frage, aber ich versuche es.Java Generic Class mit dem Generic-Type erweitert mehrere andere Klassen

Lets sagen, dass ich diese Klassen haben:

class CellType1 { 

    public void doSomething(){ 
     // does something ClassType1 specific 
    } 
} 

class CellType2 { 

    public void doSomething(){ 
     // does something ClassType2 specific 
    } 
} 

class CellType3 { 

    public void doSomething(){ 
     // does something ClassType3 specific 
    } 
} 

Diese Klassen die gleichen Funktionen teilen, aber die Funktionen selbst anders arbeiten. Jetzt habe ich diese Klasse:

class Map<CellTypes>{ 
    CellTypes cell; 

    //... 
     public void function(){ 
      cell.doSomething(); 
     } 

    //... 

    } 

Diese Klasse 'Generic Type wird später eine der drei oberen Klassen sein. Und in dieser Klasse möchte ich auf die doSomething() - Funktion für dieses spezifische CellType-Objekt zugreifen. Ich habe es versucht

class Map<CellTypes extends CellType1, CellType2, CellType3> { 
/*...*/ 
} 

Aber das beschränkt mich auf die Funktion/s von CellType1. Wie kann ich die Funktionen aus verschiedenen Klassen in einer generischen Klasse verwenden? Vielleicht hat jemand eine bessere Idee als ich! Ich hoffe, das war verständlich.

Vielen Dank im Voraus.

EDIT:

Ich brauche meine Klasse Karte als eine generische Klasse haben, weil ich verschiedene Objekte von der Karte erstellen müssen und geben sie die Zelltyp-Klasse, die sie brauchen, um mit zu arbeiten.

+1

Sie können nicht. Warum haben sie keinen gemeinsamen Supertyp? – shmosel

+1

Können Sie nicht die drei 'CellType *' - Klassen erweitern eine gemeinsame Schnittstelle oder Klasse? – jensgram

+0

Haben Sie alle drei Klassen erweitern oder implementieren eine Super-Klasse/Schnittstelle, dann haben Sie Ihre Karte generische sein, dass Supertype –

Antwort

1

Sie eine Schnittstelle erstellen:

interface CellType { 
    public void doSomething(); 
} 

und implementieren Sie die Schnittstelle wie folgt aus:

class CellType1 implements CellType { 

    public void doSomething(){ 
     // does something ClassType1 specific 
    } 
} 

class CellType2 implements CellType { 

    public void doSomething(){ 
     // does something ClassType2 specific 
    } 
} 

class CellType3 implements CellType { 

    public void doSomething(){ 
     // does something ClassType3 specific 
    } 
} 

Map Klasse:

class Map<T extends CellType> { 
    T cell; 

    //... 
     public void function(){ 
      cell.doSomething(); 
     } 
    //... 
} 
+0

Ehrfürchtig, das ist, was ich gesucht! Leider können Sie das Schlüsselwort "extends" nur in den generischen Klammern verwenden. Funktioniert es noch, wenn ich ein Intrface erweitere? – kalu

+0

@kalu Sie können eine 'Schnittstelle' nicht" erweitern ", es ist ein Syntaxfehler. nur kann eine Klasse "erweitern". Lesen Sie zuerst über die Schnittstelle: https://docs.oracle.com/javase/tutorial/java/concepts/interface.html – Blasanka

+0

@kalu Sie können! Ich habe meine Antwort bearbeitet. –

0
public interface CanDoSomething { 
    public void doSomething(); 
} 

Dann werden alle anderen Klassen implementieren diese int erface. Dies funktioniert nur, wenn die Methodensignatur in allen Fällen gleich ist.

0
interface CellType { 
    void doSomething(); 
} 
class CellType1 implements CellType { 
    public void doSomething(){ 
     //your logic 
    } 
} 
//similar implementation logic for CellType2 and CellType3 
class Map { 
    private CellType cellType; 
    public Map(CellType cellType){ 
     this.cellType = cellType; 
    } 
    public void someFunc(){ 
     cellType.doSomething(); 
    } 
} 

hoffe, das hilft