接口getter的Java泛型返回类型(<t> T get();)

时间:2017-01-12 18:17:36

标签: java generics design-patterns interface return-value

我正在设计一个SDK,它将提供:基本定义(接口),日志和不同项目的事务引擎。每个项目都将被视为一个平台,并将作为SDK的基础开发为一个不同的项目;它们有相似之处,但每个实现都应该能够解决特定的行为,但是核心SDK的基本定义应该可以解决大部分问题。例如:HUUniversity或MITUniversity

到目前为止,我几乎已经取得了所有成就:有StudentManager接口为任何实现提供基本行为:

public interface StudentManager<T> extends Manager, Release {
    int getCurrentStudent();
    int getTotalStudent();
    TransactionManager getStudentManager();
    List<T> getStudent();
    void addStudent(T participant);
    T getStudent(String id);
    T removeStudent(String id);
}

这样每个平台实现都能够实现自己的定义,其中基本上从SDK中提供的基本定义扩展,但每个实现将是强类型的,并且能够实现新的行为:

public interface HUStudentManager extends StudentManager<HUStudent>, ParticipantListener {
     List<HUStudentCommand> getCommands(String audioId);
     HUStudent getParticipant(ListType list, String id);
     HUStudent getParticipantByName(String name);
     List<HUStudent> getParticipants(StudentState state);
     List<HUStudent getParticipantsOnList(ListType list);
     List<HUStudent> getParticipantsOnList(ListType list, Sort sort);
     void addParticipantOnList(HUStudent participant, ListType listType, long epoch);
     HUStudentCommand removeCommand(String id);
     HUStudentCommand removeParticipantByName String name);
     void saveCommand(HUStudentCommand command)
}

实现:HU平台有自己的StudentManager定义(HUStudentManager),并且从SDK(在SDK上定义)的基础上扩展,因为SDK不知道任何HUStudent定义我添加了一个通用参数,所以每个

public class HUStudentManagerImpl extends HU implements
    HUStudentManager<HUStudent> {

    @Override
    public void addStudent(HUStudent student) {
        if(Utils.isNull(m_students.putIfAbsent(student.getId(), participant))){
            m_totalStudents.incrementAndGet();
            getLogger().log(Keywords.DEBUG,"{0}The instance: {1} with the specified key: {2} has been added to the ConcurrentMap<String, HUStudents>", getData(), student.getClass().toString(), student.getId());
        }else{
            getLogger().log(Keywords.WARNING,"{0}The instance: {1} with the specified key: {2} already exists in the ConcurrentMap<String, HUStudents>", getData(), student.getClass().toString(), student.getId());
        }           
    }
}

上面的示例工作正常并解决了我留给每个开发人员使用他自己的特定平台定义的问题,当然这将从基本定义扩展

但是我无法弄清楚如何让开发人员在接口定义中使用他自己的定义来表示单一类型,即:

public interface Student extends IManager, IRelease {
    UUID getUUID();
    String getId();
    <T> T getSchedule();
    <T> T getElapsedTime();
}

我假装基本界面允许每个开发人员使用自己的定义强制他们实现基本行为或实现新行为但扩展SDK上的现有行为:

 public interface HUStudent extends Student {
        HUClass getClass()
    }

如何在最终的HUStudentImpl类中实现它,而不会出现编译器错误以抑制类型。是可能的,或者我应该使用所需类型隐藏超类中的定义

 public interface HUStudentImpl extends HU, implements HUStudent {
    //Type safety: The expression of type getSchedule() needs unchecked 
    //conversion to conform to HUSchedule 
    HUSchedule getSchedule(); //Def from Student interface at SDK
    HUElapsedTime getElapsedTime(); //Def from Student interface at SDK
}

我不能在Student接口上使用参数,因为每个getter可能是不同的类型。

希望有人能够启发我并指出我正确的方向。

提前致谢,最诚挚的问候。

0 个答案:

没有答案