Java F-bounded

Java F-bounded

上次在StackOverflow上面问了一个问题,下面这种模式有什么用处.

    abstract class Base<T extends Base<T>> {

    }

    class Variant<T extends Variant<T>> extends Base<T> {

    }

我是在另外一个问题上面看到的这样的一段代码,一开始一直都不理解,后面看了那些回答的结果,这个F-bounded类型最贴近我想问的。

想明白F-bounded是什么以及它的用处,我举个例子可能就会很清楚的了。下面是wiki中的一个例子。

    class I{
    }

    class A <T extends I>{
        public T id(T x){
            return x
        }
    }

A类型里面的id函数的参数被限制为I的子类的。再看下面这一段代码

    abstract class I<T extends I<T>>{
        public T clone(T x);
    }

    class A extends I<A>{
        @Override
        public A clone(A x){
            return x
        }
    }

这里面通过I就将clone函数的参数限制为A本身了。这是一个非常好的类型复制方法。它很好地限制了类型的参数。显然I也可以是Java的接口,这是Java模版一个非常巧妙的使用。

回到第一段代码,如果我们有VariantA继承Variant,即

class VariantA extends Variant<VariantA>{
}

那第一段代码就可以正常使用了。它也可以发挥F-bounded代码的效果。对某些函数进行参数限制。有了VariantA后,也可以这样去实例化Variant。

Variant<VariantA> variant = new Varaint<VariantA>();

或者

Variant<VariantA> variant = new VariantA();

这段时间看开源项目的源码收获颇多,见识了很多东西,接下来还需要自己研读,慢慢地好好总结。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值