案例
问题
今天遇到这么一个问题,公共调度类:
package fanxingTest;
public abstract class BaseFunction {
public void excuete(BaseContent baseContent){
fun1(baseContent);
fun2(baseContent);
}
public abstract void fun1(BaseContent baseContent);
public abstract void fun2(BaseContent baseContent);
}
和公共参数类
package fanxingTest;
public class BaseContent {
private String base1;
public String getBase1() {
return base1;
}
public void setBase1(String base1) {
this.base1 = base1;
}
}
其中有两个方法fun1和fun2,根据具体业务情况进行实现,于是第一个业务如下:
package fanxingTest;
public class DetailFunction1 extends BaseFunction {
@Override
public void fun1(BaseContent baseContent) {
Content1 baseContent1 = (Content1)baseContent;
System.out.println("fun1:" + baseContent1.getContent1());
}
@Override
public void fun2(BaseContent baseContent) {
Content1 baseContent1 = (Content1)baseContent;
System.out.println("fun2:" + baseContent1.getContent1());
}
public static void main(String[] args) {
BaseFunction baseFunction = new DetailFunction1();
Content1 content1 = new Content1();
content1.setContent1("参数1");
baseFunction.excuete(content1);
}
}
其中实际的业务参数类为Content1.java:
package fanxingTest;
public class Content1 extends BaseContent {
private String content1;
public String getContent1() {
return content1;
}
public void setContent1(String content1) {
this.content1 = content1;
}
}
其中有一个很不爽的地方就是在DetailFunction1的fun1和fun2中,我必须使用强转才能继续我的业务,否则我无法使用我Content1类中自己的参数。
解决方案
有了上面的这个烦恼,所以进行了思考,我们能否利用泛型来解决这个问题,答案是:可以的。看下面,公共调度类加上泛型:
package fanxingTest;
public abstract class BaseFunction<Content extends BaseContent> {
public void excuete(Content baseContent){
fun1(baseContent);
fun2(baseContent);
}
public abstract void fun1(Content baseContent);
public abstract void fun2(Content baseContent);
}
业务实现类变成这样:
package fanxingTest;
public class DetailFunction1 extends BaseFunction<Content1> {
@Override
public void fun1(Content1 baseContent) {
System.out.println(baseContent.getContent1());
System.out.println("fun1:" + baseContent.getContent1());
}
@Override
public void fun2(Content1 baseContent) {
System.out.println("fun2:" + baseContent.getContent1());
}
public static void main(String[] args) {
BaseFunction baseFunction = new DetailFunction1();
Content1 content1 = new Content1();
content1.setContent1("参数1");
baseFunction.excuete(content1);
}
}
我们会发现,通过在子类中明确父类的泛型类型,即可让自己的所有方法直接使用实际类型了,巧妙的解决了我没一个方法都需要强转的问题。