Java泛型和数组类型,不是你想的(例如来自泛型类型的数组)

les*_*mal 16 java generics

我试图指定一个泛型类必须是一个数组,或者更好的是一个原始数组.到目前为止,这是我的工作:

interface Foo<T> {
  void process( T data );
}

public class Moo implements Foo<int[]> {
  void process( int[] data ) {
     // do stuff here
  }
}
Run Code Online (Sandbox Code Playgroud)

这是完全有效的Java代码并且有效,因为原始数组扩展了Object.请注意,这个问题我一直在寻找的所有其他Java数组通用问题完全不同.在那种情况下,人们希望用泛型类型创建一个数组.

问题是类型T可以是扩展Object的任何东西.我想要的是做一些像:

<T extends ONLY ARRAYS>
Run Code Online (Sandbox Code Playgroud)

要么

<T extends ONLY PRIMITIVE ARRAYS>.
Run Code Online (Sandbox Code Playgroud)

那可能吗?

编辑:最终目标是对传入的数组类型添加编译时检查.现在可以传入任何旧对象,它将编译得很好.只有在抛出类转换异常时才会在运行时发现错误.事实上,这是Java中泛型的全部要点,以增加更强大的编译时类型检查.

Jef*_*rey 10

你不能做这个.没有类可以扩展数组,因此永远不会有满足泛型参数的类型T extends Object[].(除了Object[]它本身,但你不会使用泛型.)

你能做的是这样的:

public interface Foo<T extends Number> {
    public void process(T[] data);
}
Run Code Online (Sandbox Code Playgroud)

但是你可能会遇到拳击的性能问题.

  • 不太对,特定类型的数组(如String [])可分配给Object [].但这对原始数组没有帮助. (4认同)

mer*_*ike 8

在Java中,类型参数可以由亚型关系的约束,并且所有阵列的唯一共同超类型 Object,ClonableSerializable.你可以得到最接近的是约束到Object[],这是与非基本组件类型,或者可能对所有阵列的超类型Number[],这是超类Integer[],Long[]...

即使Java确实支持这样的约束,你会如何对该数组做任何有用的事情?您无法读取单个元素,因为您无法声明变量来保存结果,也无法写入单个元素,因为您无法写下可分配给数组元素的表达式.

也就是说,我将类型变量绑定到组件类型,而不是数组类型:

interface Foo<T extends Whatever> {
    void process(T[] data );
}
Run Code Online (Sandbox Code Playgroud)

因为你可以参考T[]知道T,但知道a T extends Object[]并不直接允许你引用组件类型.

编辑:Jeffrey正确地指出数组类型不能在类型边界中使用,即<T extends Whatever[]>不编译,所以你必须遵循我的声明<T extends Whatever>和使用T[]引用数组类型的建议.