限制泛型中的类型 class
Restricting types in a generic class
这是我第一次使用泛型,所以我对术语有点陌生。无论如何,假设我正在创建自己的 AbstractList:
实现
class MyList<T> extends AbstractList<T>
而且我有以下三个我无法更改的类:
class TestNumber
class One extends TestNumber
class Two extends TestNumber
class Three extends TestNumber
// etc...
是否可以更改 MyList
的类型参数以仅允许类型 One
和 Two
,而不允许从 TestNumber
继承的其他类?
无法将 T
限制为 One
或 Two
之一。但是你可以做一些非常相似的事情。
制作一个 class 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() {}
}
然后让你的 class 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>
。
这是我第一次使用泛型,所以我对术语有点陌生。无论如何,假设我正在创建自己的 AbstractList:
实现class MyList<T> extends AbstractList<T>
而且我有以下三个我无法更改的类:
class TestNumber
class One extends TestNumber
class Two extends TestNumber
class Three extends TestNumber
// etc...
是否可以更改 MyList
的类型参数以仅允许类型 One
和 Two
,而不允许从 TestNumber
继承的其他类?
无法将 T
限制为 One
或 Two
之一。但是你可以做一些非常相似的事情。
制作一个 class 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() {}
}
然后让你的 class 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>
。