有没有一种方法可以限制泛型参数为数组?

3

我尝试了 "T extends Array",但它不起作用。

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

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

根据我所看到的,我认为这是不可能的,但是嘿,我不是Java大师。


1
不可以,但是你可以仅仅像使用数组一样使用T,例如返回T[],接受T[]参数等。 - Andy Turner
@AndyTurner 但这不支持原语数组(int[])问题示例中使用的,只支持对象数组。 - Andreas
@Andreas,它不会;但是它适用的类型比它不适用的8种更多。 - Andy Turner
@AndyTurner有趣的是,我需要它用于原始类型。嗯,我看到了,谢谢! - Juan
2
它会有什么用处? - shmosel
2个回答

2

如果您想限制类型变量T为引用类型数组,则可以选择将T作为组件类型,并限制组件类型,并在需要数组类型的地方使用T[],即代替

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

Foo<String[]> f;

you would have

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

Foo<String> f;

如果您想允许T也是原始数组类型,那么如果不允许非数组引用类型,这是不可能的,因为像int[]boolean[]等原始数组类型的唯一超类型是Object(也可能是CloneableSerializable)。没有“只有”基本和引用数组的超类型。你能做的最严格的限制可能是这样的:
public class Foo<T extends Cloneable & Serializable>

如果你这样做了,那么你将无法对 T 做任何操作,除非是你可以对任何 Object 做的操作(请注意,CloneableSerializable 接口都不提供任何方法),所以你可能干脆不限制 T


0
不,你不能使用Array来扩展一个类。你只能扩展Java类型,比如类、接口等(你也不能扩展原始类型int)。如果你想要一个新的数组类型,你必须创建一个该对象的数组,例如int[] intArray = new int[5];或者Foo[] foo = new Foo[5];

点击这里阅读为什么不允许使用


我并不想扩展数组,我只是想知道是否有一个通配符用于限制参数,主要是为了使用共享的东西,比如 .length 等等。 对于对象,我可以采用绕路的方法,但对于基本类型来说却不行。幸运的是,我只需要重复代码 8 次,谢谢! - Juan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接