Generische Interface - Problem

jCoder1984

Aktives Mitglied
Hallo

ich möchte für meine Object einen Service anbieten, um andere Objecte hinzuzufügen. Beispiel : Ein Team Object soll Member Objecte löschen und hinzufügen können. Genauso gibt es Vereine, die Team Objecte löschen und hinzufügen können sollen.

Nun gibt es ein Problem : ein Teil der Daten soll aus einer externen Datenquelle gelsen werden. Ein anderer Teil wird vom User eingegeben. Warum dies ist ist nicht wichtig. Wichtig ist allerdings, dass importierte Objekte nicht vom User manipuliert werden dürfen.

Aus diesem Grund soll ein importierter Club nur importierte Mannschaften hinzufügen dürfen.

das ganze sieht dann in etwa so aus :
Java:
public interface Service<T> {

    /**
     * @return a list with all elements <br>
     */
    public List<T> getElementList();

    /**
     * try to add a new elment to the list <br>
     * if the element exists already in the list return it <br>
     * otherwise return the new element <br>
     *
     * @return the existsing or the new created element <br>
     */
    public T addElement(T element);

    /**
     * remove an element of the list <br>
     */
    public void removeElement(T element);

}

Java:
public interface Club {

    /**
     * @return the name <br>
     */
    public String getName();

    /**
     * @return the member service <br>
     */
    public Service<Member> getMemberService();

    /**
     * @return the team service <br>
     */
    public Service<Team> getTeamService();

}

Java:
public class UserService<T extends UserObject> implements Service<T> {

    @Override
    public List<T> getElementList() {
    // TODO Auto-generated method stub
    return null;
    }

    @Override
    public T addElement(T element) {
    // TODO Auto-generated method stub
    return null;
    }

    @Override
    public void removeElement(T element) {
    // TODO Auto-generated method stub

    }

}

Java:
@RequiredArgsConstructor
@Getter
@EqualsAndHashCode
@ToString
public class UserClub implements Club {

    @NonNull
    private String name;
    private Service<Member> memberService = new UserService<Member>();
    private Service<Team> teamService = new UserService<UserTeam>();
}

nun beschwert sich java, :
Code:
Type mismatch: cannot convert from UserService<UserTeam> to Service<Team>

Hat jeamnd eine Idee
 
In Generics kann man keinem Subtypen dem Basistyp ohne Bounds (s.u.) zuweisen. Warum dies nicht geht, zeigt folgendes Beispiel:
Java:
Service<UserTeam> userTeamService = new Service<UserTeam>();
Service<Team> teamService = userTeamService;
teamService.addElement(new AnotherTeam());
UserTeam userTeam = userTeamService.getElementList().get(0);
// hier würde es zu einem Laufzeitfehler kommen, da in 'userTeamService' kein 'UserTeam' ist, sondern ein Objekt 'AnotherTeam'.

Lösung: benutze Bounds.
Java:
Service<? extends Team> teamService = new UserService<UserTeam>();
Allerdings kann man dann auf 'teamService' keine Methoden verwenden, die den Generic-Typ als Parameter besitzen. Die Methode 'getElementList' kann also verwendet werden, 'addElement' und "removeElement' nicht.

Grüße
Kevin
 
Hallo vielen Dank für deine Antwort. Nun weiß ich zumindest in welche Richtung mein Problem geht - von Interface Bounds habe ich bisher noch nichts gehört.

Ich habe nun versucht das Problem so lösen :

Java:
public class TeamService<T extends UserObject & Team> implements Service<T> {

    @Override
    public T addElement(T element) {
    // TODO Auto-generated method stub
    return null;
    }

    @Override
    public void removeElement(T element) {
    // TODO Auto-generated method stub

    }

    @Override
    public List<T> getElementList() {
    // TODO Auto-generated method stub
    return null;
    }

}

Java:
public class UserClub implements Club {

    @NonNull
    private String name;
//    private Service<? extends Member> memberService = new UserService<DefaultMember>();
    private Service<? extends Team> teamService = new TeamService<UserTeam>();
   
   
    public void test() {
    UserTeam element = new UserTeam();
//    ImporterTeam element = new ImporterTeam("test");
   
   
    teamService.addElement(element);
    }

Leider bekomme ich jetzt den folgenden Fehler :
The method addElement(capture#1-of ? extends Team) in the type Service<capture#1-of ? extends Team> is not applicable for the arguments (UserTeam)

Ich bräucht also noch einmal Hilfe. Vielen Dank
 
Ich habe doch eine Lösun gefunden :
Code:
public interface Club {

    /**
     * @return the name <br>
     */
    public String getName();

    /**
     * @return the member service <br>
     */
    public Service<? extends Member> getMemberService();

    /**
     * @return the team service <br>
     */
    public Service<? extends Team> getTeamService();

}

Code:
public class UserClub implements Club {

    @NonNull
    private String name;
//    private Service<? extends Member> memberService = new UserService<DefaultMember>();
    private Service<UserTeam> teamService = new TeamService();
   
   
    public void test() {
    UserTeam element = new UserTeam();
//    ImporterTeam element = new ImporterTeam("test");
   
   
    teamService.addElement(element);
    }
 

Neue Themen


Zurück
Oben