繁体   English   中英

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

[英]Java generic and array types, no not what you are thinking (e.g. arrays from generic types)

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

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

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

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

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

<T extends ONLY ARRAYS>

要么

<T extends ONLY PRIMITIVE ARRAYS>.

那可能吗?

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

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

你能做的是这样的:

public interface Foo<T extends Number> {
    public void process(T[] data);
}

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

在Java中,类型参数只能由子类型关系约束,并且所有数组的唯一常见超类型 ObjectClonableSerializable 你可以得到的最接近的是约束到Object[] ,它是具有非基本组件类型的所有数组的超类型,或者可能是Number[] ,它是Integer[]Long[]的超类型,...

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

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

interface Foo<T extends Whatever> {
    void process(T[] data );
}

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

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

没有办法。 没有“有趣的”接口,也没有任何超类型,但基元数组存在对象:

public class SOTEST {    
    public static void main(String[] args) throws Exception {
        int[] arr = new int[] {};
        Class c = arr.getClass();
        for(Class clazz:c.getInterfaces()) {
            System.out.println(clazz.getName());
        }

        System.out.println(c.getSuperclass().toString());
    }
}

X的数组没有类型层次结构。 Integer []不是Number []的子类。

要获得所需内容,请使用数组组件类型作为类型参数T,并将参数和返回类型声明为T的数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM