Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 限制泛型类中的类型_Java_Generics - Fatal编程技术网

Java 限制泛型类中的类型

Java 限制泛型类中的类型,java,generics,Java,Generics,这是我第一次使用泛型,所以我对术语有点不熟悉。无论如何,假设我正在创建自己的AbstractList实现: class MyList扩展了AbstractList 我有以下三个我不能改变的课程: class TestNumber class One extends TestNumber class Two extends TestNumber class Three extends TestNumber // etc... 是否可以更改MyList的类型参数以仅允许类型One和Two

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

class MyList扩展了AbstractList

我有以下三个我不能改变的课程:

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

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

不可能将
T
限制为
One
Two
中的一个。然而,你可以做一些非常相似的事情

用两个实例创建一个类
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() {}
}
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
}
List<One> list1 = MyList.newInstance(NumberType.ONE);

List<Two> list2 = MyList.newInstance(NumberType.TWO);
由于
MyList
的构造函数是私有的,因此实例化新
MyList
的唯一方法是使用静态
newInstance()
方法。实例化
MyList
的代码如下所示:

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() {}
}
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
}
List<One> list1 = MyList.newInstance(NumberType.ONE);

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

无法实例化
MyList

创建一个虚拟接口,只有一个和两个实现它,并将其用作泛型类型。参见@PM77-1,如果不允许我更改这些类怎么办?对不起,我刚才忘了提到这个关键的问题。