具有上限

时间:2015-11-03 15:15:14

标签: java generics

假设我有一个接口和两个扩展类,如下所示;

public interface UpdateHelper<T>{
   List<T> getItemsToOperate();
}

public class ProfileUpdateHelper implements UpdateHelper<Profile>{
//class logic
}

public class PlayerUpdateHelper implements UpdateHelper<Player>{
//class logic
}

Player和Profile是两个具体的类。当我设计上面的课程时,一切都很好。但我想在具体的Profile和Player类之间引入另一个抽象层,例如;

public abstract class Updatable{
//common attributes will be here
}
public class Player extends Updatable{
}
public class Profile extends Updatable{
}

并使用我的助手类;

public interface UpdateHelper<T>{
   List<T> getItemsToOperate();
}

public class ItemUpdateHelper<? extends Updatable> implements UpdateHelper<Updatable>{
//class logic
}

我认为我应该使用通配符,因为任何扩展可更新的类实例都可以与辅助类一起使用,并且使用哪个子类实例无关紧要。
但是当我像上面这样写的时候,在类名和代码不能被编译之后,我得到一个意想不到的通配符错误。我错过了什么,做错了什么或类似的东西都不能在java中完成。顺便说一句,我使用的是java 8。

2 个答案:

答案 0 :(得分:2)

您不能在类声明中使用通配符。而是传递类似T的类型参数:

public class ItemUpdateHelper<T extends Updatable> implements UpdateHelper<Updatable>{
...
}

您可以指定Updatable的具体实现:

ItemUpdateHelper<Player> playerHelper = new ItemUpdateHelper<>();
ItemUpdateHelper<Profile> profileHelper = new ItemUpdateHelper<>();

与否:

ItemUpdateHelper helper = new ItemUpdateHelper();

答案 1 :(得分:0)

您可能希望像

一样实现它
public class ItemUpdateHelper<T extends Updatable> implements UpdateHelper<T>{
}