Java中的泛型数组,是否强制所有泛型都是同一类型?

Java中的泛型数组,是否强制所有泛型都是同一类型?,java,generics,Java,Generics,在Java中玩泛型和其他东西时,遇到了一个潜在的问题。这是我所想的一个简化版本 public class Test<T> { private T[] arrayOfGenerics; int top; public Test(int size) { arrayOfGenerics = (T[]) new Object[size]; top = 0; } public void add(T toAdd) {

在Java中玩泛型和其他东西时,遇到了一个潜在的问题。这是我所想的一个简化版本

public class Test<T> {
    private T[] arrayOfGenerics;
    int top;

    public Test(int size) {
        arrayOfGenerics = (T[]) new Object[size];
        top = 0;
    }

    public void add(T toAdd) {
        arrayOfGenerics[top++] = toAdd;
    }

    public static void main(String[] args) {
        Test myTest = new Test(10);
        myTest.add("Some String");  //First value added is a String
        myTest.add(12);             //Way to make this NOT work, since myTest should only accept Strings now
    }

}
公共类测试{
私有T[]阵列广义;
int top;
公共测试(整数大小){
arrayOfGenerics=(T[])新对象[大小];
top=0;
}
公共无效添加(T到添加){
arrayOfGenerics[top++]=toAdd;
}
公共静态void main(字符串[]args){
测试myTest=新测试(10);
myTest.add(“某些字符串”);//添加的第一个值是一个字符串
myTest.add(12);//使其不起作用的方法,因为myTest现在应该只接受字符串
}
}
显然,从生产角度来看,这没有多大用处,但我考虑的是更复杂的数据结构,您希望具有泛型的灵活性,但仍然强制要求它们都必须是相同的类型。这是一种可怕的解释方式,但回到上面的示例代码,是否有一种方法可以使其在有人实例化测试实例时,必须指定
arrayOfGenerics
的类型,并通过构造函数,或者仅仅是基于第一类增值


另一种解释方法是,假设您正在实现自己的堆栈或LinkedList数据结构。您希望它是所有相同类型对象的堆栈。它可以是字符串、整数等等,但它必须“选择”一个并坚持使用它

我认为您在这里没有有效地使用泛型。例如,执行以下操作:

// With this statement, the types that can be contained in the
// instance is fixed now.
Test<String> myTest = new Test<>(10);
myTest.add("Some String"); // this will work
myTest.add(12);  // this won't compile
您必须将
泛型
类型指定为
Test myTest=new Test(10)
包含相同类型的对象。

那么您的类就不能添加其他类型的
对象
。请参见下面的示例

Test<String> myTest = new Test(10);

您当前正在使用。尝试
testtest=newtest()很好,是的,但是这依赖于实例化类的人员来指定类型。有没有办法在类本身中强制执行该要求?
Test<String> myTest = new Test(10);
//constructor
public Test() {
    top = 0;
    arrayOfGenerics = (T[]) new Object[top];
}

//add method
public void add(T toAdd) {
    top++;
    T[] newArray = (T[]) new Object[top];
    newArray[top - 1] = toAdd;
    System.arraycopy(arrayOfGenerics, 0, newArray, 0, top - 1);
    arrayOfGenerics = newArray;
}