有没有办法将泛型参数限制为数组?

Is there a way to restrict generic parameters to be arrays?

我试过 "T extends Array" 但是没用,

public class Foo<T extends Array> {
    { ...}
}

public class Bar {
    {
        Foo<int[]> f; <-- Error
    }
}

据我所见,我认为这不可能,但是嘿,我不是 Java 大师

不,您不能用 Array 扩展 class。您只能扩展 Java 类型,例如 classes、接口等(您也不能扩展 int,因为它是原始类型)。如果你想要一个新类型的数组,你必须创建一个该对象的数组,例如int[] intArray = new int[5];Foo[] foo = new Foo[5];

read here for why it is not allowed

如果你想限制类型变量T为array-of-references类型,你可以将T作为组件类型,限制组件类型,并使用T[] 你需要数组类型的地方,即而不是

public class Foo<T extends Object[]> {
   T obj;
}

Foo<String[]> f;

你会

public class Foo<T extends Object> {
   T[] obj;
}

Foo<String> f;

如果你想允许 T 也是 array-of-primitives 类型,那么如果不允许 non-array 引用类型也是不可能的,因为 array-of-primitive 类型的唯一超类型像 int[]boolean[] 等是 Object(也许还有 CloneableSerializable)。 "just" 原始数组和引用数组没有超类型。您可以做的最严格的限制是

public class Foo<T extends Cloneable & Serializable>

如果你这样做了,你将无法用 T 做任何事情,除了你可以对任何 Object 做的事情(注意 Cloneable Serializable 接口也不提供任何方法),所以你最好不要限制 T