限制泛型类中的类型

时间:2015-01-07 04:57:07

标签: java generics

这是我第一次使用泛型,所以我对术语有点不熟悉。无论如何,假设我正在创建自己的AbstractList实现:

class MyList<T> extends AbstractList<T>

我有以下三个课程,我无法改变:

 class TestNumber
 class One extends TestNumber
 class Two extends TestNumber
 class Three extends TestNumber
 // etc...

是否可以更改MyList的类型参数以仅允许OneTwo类型,而不允许从TestNumber继承的其他类?

1 个答案:

答案 0 :(得分:1)

无法将T限制为OneTwo之一。但是你可以做一些非常相似的事情。

使用两个实例创建一个类NumberType,如下所示:

public final class NumberType<T extends TestNumber> {

    public static final NumberType<One> ONE = new NumberType<One>();

    public static final NumberType<Two> TWO = new NumberType<Two>();

    private NumberType() {}
}

然后让你的班级MyList看起来像这样:

public class MyList<T extends TestNumber> extends AbstractList<T> {

    public static <T extends TestNumber> MyList<T> newInstance(NumberType<T> type) {
        return new MyList<T>();
    }

    private MyList() {}

    // Class body omitted
}

由于MyList的构造函数是私有的,因此实例化新MyList的唯一方法是使用静态newInstance()方法。实例化MyList的代码如下所示:

List<One> list1 = MyList.newInstance(NumberType.ONE);

List<Two> list2 = MyList.newInstance(NumberType.TWO);

无法实例化MyList<Three>