[英]How to call a method on a generic type variable
我正在编写一个非常直接和简单的方法:我希望它能够获得一个对象,然后处理它的开始和结束日期。 我希望它工作的所有对象都有日期来做事,但当然eclipse不允许我编写这样的方法。 可以吗? 怎么样?
这是我正在研究的框架
public <T> void updateStuff(T stuffObject, Calendar startDate, Integer delta) {
stuffObject.setStartDate(startDate);
Calendar calendarEnd = Calendar.getInstance();
calendarEnd = startDate;
calendarEnd.add(Calendar.MONTH, delta);
stuffObject.setEndDate(calendarEnd);
}
一些主题,但您可以简单地删除通用性并直接使用接口作为参数。
使用OldCurmudgeon接口作为示例:
interface Stuff {
void setStartDate(Calendar startDate);
void setEndDate(Calendar startDate);
}
public void updateStuff(Stuff stuffObject, Calendar startDate, Integer delta) {
stuffObject.setStartDate(startDate);
Calendar calendarEnd = Calendar.getInstance();
calendarEnd = startDate;
calendarEnd.add(Calendar.MONTH, delta);
stuffObject.setEndDate(calendarEnd);
}
这不是必须在这里使用泛型,这给了一个更冗长的方法,并且对于非启动,更加模糊。
如果您返回实例,则通用可能很有用,例如链接该方法。 因为在我的示例中,您需要转换返回实例。
你必须告诉Java在T
对象中有一个setStartDate
和一个setEndDate
方法。
interface Stuff {
void setStartDate(Calendar startDate);
void setEndDate(Calendar startDate);
}
public <T extends Stuff> void updateStuff(T stuffObject, Calendar startDate, Integer delta) {
stuffObject.setStartDate(startDate);
Calendar calendarEnd = Calendar.getInstance();
calendarEnd = startDate;
calendarEnd.add(Calendar.MONTH, delta);
stuffObject.setEndDate(calendarEnd);
}
然后你的对象需要实现这个接口。
class SomeStuff implements Stuff {
Calendar startDate;
Calendar endDate;
@Override
public void setStartDate(Calendar startDate) {
this.startDate = startDate;
}
@Override
public void setEndDate(Calendar startDate) {
this.endDate = endDate;
}
}
顺便提一下,您计算结束日期的方式很危险,实际上您正在修改作为参数传递的Calendar
。
Calendar calendarEnd = Calendar.getInstance();
// Throw away the new Calendar and point calendarEnd at the parameter.
calendarEnd = startDate;
// change the parameter.
calendarEnd.add(Calendar.MONTH, delta);
要传递给此方法的对象必须实现公共接口或扩展包含setStartDate()
和setEndDate()
方法的公共超类。
然后你可以在T
上定义一个绑定的类型:
public <T extends SomeInterface> void updateStuff(T stuffObject, Calendar startDate, Integer delta) {
stuffObject.setStartDate(startDate);
Calendar calendarEnd = Calendar.getInstance();
calendarEnd = startDate;
calendarEnd.add(Calendar.MONTH, delta);
stuffObject.setEndDate(calendarEnd);
}
其中SomeInterface
是通用接口。
您可以将泛型类型公开的方法定义到接口中:
public <T extends MyInterface> void updateStuff(T stuffObject, Calendar startDate, Integer delta) {
stuffObject.setStartDate(startDate);
Calendar calendarEnd = Calendar.getInstance();
calendarEnd = startDate;
calendarEnd.add(Calendar.MONTH, delta);
stuffObject.setEndDate(calendarEnd);
}
interface MyInterface{
void setStartDate(Calendar c);
void setEndDate(Calendar c);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.