有没有办法将泛型参数限制为数组?
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
(也许还有 Cloneable
和 Serializable
)。 "just" 原始数组和引用数组没有超类型。您可以做的最严格的限制是
public class Foo<T extends Cloneable & Serializable>
如果你这样做了,你将无法用 T
做任何事情,除了你可以对任何 Object
做的事情(注意 Cloneable
Serializable
接口也不提供任何方法),所以你最好不要限制 T
。
我试过 "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
(也许还有 Cloneable
和 Serializable
)。 "just" 原始数组和引用数组没有超类型。您可以做的最严格的限制是
public class Foo<T extends Cloneable & Serializable>
如果你这样做了,你将无法用 T
做任何事情,除了你可以对任何 Object
做的事情(注意 Cloneable
Serializable
接口也不提供任何方法),所以你最好不要限制 T
。