假设我有一个接口和两个扩展类,如下所示;
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。
答案 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>{
}