【问题标题】:Is there a way to restrict generic parameters to be arrays?有没有办法将泛型参数限制为数组?
【发布时间】:2018-08-26 02:28:24
【问题描述】:

我试过“T extends Array”,但是没用,

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

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

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

【问题讨论】:

  • 不,但您只能以类似数组的方式使用T,例如返回T[],接受T[]参数等
  • @AndyTurner 但这不支持问题示例使用的基元数组 (int[]),仅支持对象数组。
  • @Andreas 它不会;但它适用的类型比它不适用的 8 种要多。
  • @AndyTurner 有趣的是,我需要它用于原始类型。嗯,我看到了,谢谢!
  • 它有什么用处?

标签: java arrays generics restriction


【解决方案1】:

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

read here for why it is not allowed

【讨论】:

  • 我不是想扩展数组,我只是想知道是否有一个限制参数的通配符,主要是使用共享的东西,比如.length等。我可以对对象使用一种方法,但不能对原始类型使用一种方法,但幸运的是我只需要重复代码 8 次,谢谢!
【解决方案2】:

如果您想将类型变量T 限制为引用数组类型,您可以改为将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 成为原始数组类型,那么如果不允许非数组引用类型也是不可能的,因为像 int[]、@ 这样的原始数组类型的唯一超类型987654328@ 等是Object(也可能是CloneableSerializable)。没有“只是”原始数组和引用数组的超类型。您可以做的最严格的事情是

public class Foo<T extends Cloneable & Serializable>

如果你这样做了,你将无法用 T 做任何事情,除非你可以对任何 Object 做任何事情(请注意,CloneableSerializable 接口都没有提供任何方法),那么你最好不要限制T

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多