首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"<T扩展SuperClass>“的正确用法

"<T扩展SuperClass>“的正确用法
EN

Stack Overflow用户
提问于 2011-02-17 22:58:29
回答 2查看 2.6K关注 0票数 3

我不熟悉“泛型”。这是"<T extends SuperClass>“的正确用法吗?您是否同意使用泛型后的代码更好?

代码语言:javascript
复制
Before using Generics
=================================================

public abstract class SuperSample {

    public void getSomething(boolean isProcessA) {
        doProcessX();
        if(isProcessA){
            doProcessY(new SubASample());
        }else{
            doProcessY(new SubBSample());
        }
    }

    protected abstract void doProcessX();

    protected void doProcessY(SubASample subASample) {
        // Nothing to do
    }

    protected void doProcessY(SubBSample subBSample) {
        // Nothing to do
    }

}

public class SubASample extends SuperSample {

    @Override
    protected void doProcessX() {
        System.out.println("doProcessX in SubASample");
    }

    @Override
    protected void doProcessY(SubASample subASample) {
        System.out.println("doProcessY in SubASample");
    }

}

public class Sample {

    public static void main(String[] args) {
        SubASample subASample = new SubASample();
        subASample.getSomething(true);
    }

}

After using Generics
=================================================

public abstract class SuperSample {

    public void getSomething(boolean isProcessA) {
        doProcessX();
        if(isProcessA){
            doProcessY(new SubASample());
        }else{
            doProcessY(new SubBSample());
        }
    }

    protected abstract void doProcessX();

    protected abstract <T extends SuperSample> void doProcessY(T subSample);

}

public class SubASample extends SuperSample {

    @Override
    protected void doProcessX() {
        System.out.println("doProcessX in SubASample");
    }

    @Override
    protected <T extends SuperSample> void doProcessY(T subSample) {
        System.out.println("doProcessY in SubASample");
    }

}

public class Sample {

    public static void main(String[] args) {
        SubASample subASample = new SubASample();
        subASample.getSomething(true);
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-17 23:22:58

如果你想做我认为你想做的事情,我不认为这是正确的方式(*)。如果你希望每个子类都需要实现一个方法来处理它自己的类型,那么你可以使用CRTP技巧:

代码语言:javascript
复制
abstract class Super<S extends Super<S>> {
   abstract void process(S s);
}

class SubA extends Super<SubA> {
   void process(SubA s){ /* do something */ }
}

class SubB extends Super<SubB> {
   void process(SubB s){ /* do something */ }
}

请注意,此模式强制执行子类的泛型签名,例如class SubA extends Super<SubB>不会编译。

顺便说一句,Java本身在java.lang.Enum中使用了这种技巧。

(*)如果这不是您想要强制执行的行为,请澄清。

票数 4
EN

Stack Overflow用户

发布于 2011-02-17 23:23:00

使用它是正确的。这意味着您将类型T限制为SuperSample的子类。对于第二个答案,是的,我认为使用generecis的代码更好,因为它可以防止您错误地转换类,例如使用容器(List ...)。但实际上,Java中的泛型只是语法糖,所以它们在运行时就会被删除。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5030578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档