2017-01-12 12 views
0

Nun Hallo, hier ist mein Problem.Ändern Attribut ArrayList <Class> zu ArrayList <SubClass> in einer Unterklasse

Ich würde gerne wissen, ob ein abstract class Foo gegeben, ist es möglich, irgendwie, bekommt ihr Attribut ArrayList<Bar> (Bar abstrakt zu sein), um nur eine bestimmte Unterklasse enthalten, was es früher in jeder Unterklasse von Foo enthielt .

Zum Beispiel in einer konkreten class FooChild dass extends Foo das Attribut ArrayList<Bar> würde jetzt nur enthalten konkrete class BarChild (die extends Bar).

Genauer gesagt, wenn ich dieses Stück Code bekam:

public abstract class CharactersGroup { 
    private ArrayList<Character> characters; 

    public CharactersGroup() { 
     this(new ArrayList<Character>()); 
    } 

    public CharactersGroup(ArrayList<Character> list) { 
     characters = list; 
    } 
} 

Und eine Unterklasse von CharactersGroup wäre HeroesGroup, wie folgt aus:

public class HeroesGroup extends CharactersGroup { 
    // Here is an ArrayList<Character> characters, that I would like to "become" an ArrayList<Hero> characters 

    public HeroesGroup() { 
     this(new ArrayList<Hero>()); 
    } 

    public HeroesGroup(ArrayList<Hero> list) { 
     super(list); 
    } 
} 

A Character würde gerne einfach:

Und eine Hero mögen:

public class Hero extends Character { 
    private int level; 

    public Hero(String n, int l) { 
     super(n); 
     level = l; 
    } 
} 

Antwort

0

Sie könnten Ihre abstrakten Klasse CharactersGroup Generika machen.

public abstract class CharactersGroup<C extends Character> { 
    private ArrayList<C> characters; 

    public CharactersGroup() { 
     this(new ArrayList<C>()); 
    } 

    public CharactersGroup(ArrayList<C> list) { 
     characters = list; 
    } 
} 

Subklassen wie folgt aussehen:

public class HeroesGroup extends CharactersGroup<Hero> { 

    public HeroesGroup() { 
     this(new ArrayList<Hero>()); 
    } 

    public HeroesGroup(ArrayList<Hero> list) { 
     super(list); 
    } 
} 
0

Verwendung ein allgemeiner Parameter auf der übergeordneten Klasse:

public abstract class CharactersGroup<C extends Character> { 
    private ArrayList<C extends Character> characters; 

    public CharactersGroup() { 
     this(new ArrayList<C extends Character>()); 
    } 

    public CharactersGroup(ArrayList<C extends Character> list) { 
     characters = list; 
    } 
} 

public class HeroesGroup extends CharactersGroup<Hero> { 
    // Here is an ArrayList<Character> characters, that I would like to "become" an ArrayList<Hero> characters 

    public HeroesGroup() { 
     this(new ArrayList<Hero>()); 
    } 

    public HeroesGroup(ArrayList<Hero> list) { 
     super(list); 
    } 
} 
Verwandte Themen