如何实现接收IHasDate实现类列表并返回同类型对象的方法
解决Java泛型方法接收IHasDate实现类列表并返回对应子类对象的问题
你需要用泛型方法并添加类型限定,就能实现接收任意IHasDate实现类的列表,同时返回对应类型的对象,无需重复编写方法或手动转换列表类型。
正确实现代码
首先修改Util类的方法,使用泛型限定<T extends IHasDate>:
import java.util.Date; import java.util.List; public interface IHasDate { Date getDate(); } public class A implements IHasDate { private Date date; @Override public Date getDate() { return date; } // 可根据需求添加构造器、setter等方法 } public class B implements IHasDate { private Date date; @Override public Date getDate() { return date; } } public class Util { // 泛型方法:限定T必须是IHasDate的实现类 public static <T extends IHasDate> T getUpcoming(List<T> dates) { if (dates == null || dates.isEmpty()) { return null; } T upcomingItem = dates.get(0); Date upcomingDate = upcomingItem.getDate(); for (T item : dates) { Date currentDate = item.getDate(); // 这里实现“找到最近即将到来日期”的逻辑,可根据需求调整比较规则 if (currentDate != null && (upcomingDate == null || currentDate.after(upcomingDate))) { upcomingItem = item; upcomingDate = currentDate; } } return upcomingItem; } }
调用示例
现在可以直接在持有A或B列表的类中调用,无需强转或类型转换:
import java.util.List; public class X { private List<A> aList; public A getUpcoming() { // 编译器自动推断T为A,直接返回A类型对象 return Util.getUpcoming(aList); } } public class Y { private List<B> bList; public B getUpcoming() { return Util.getUpcoming(bList); } }
为什么原来的代码不可行
你原来的Util.getUpcoming方法接收List<IHasDate>,但Java泛型是不协变的——List<A>不能直接赋值给List<IHasDate>,这会导致编译错误。而泛型方法<T extends IHasDate>可以让方法适配任意实现了IHasDate的子类列表,同时保证返回值类型与输入列表的元素类型一致,既安全又避免了重复代码。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

