java的泛型使用

案例

问题

    今天遇到这么一个问题,公共调度类:

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);
    }


}

我们会发现,通过在子类中明确父类的泛型类型,即可让自己的所有方法直接使用实际类型了,巧妙的解决了我没一个方法都需要强转的问题。

发布了39 篇原创文章 · 获赞 9 · 访问量 1020

猜你喜欢

转载自blog.csdn.net/qq_30095631/article/details/103501003