【问题标题】:In Java, is it possible to use a type variable, as an array element, inside an Interface?在Java中,是否可以在接口内使用类型变量作为数组元素?
【发布时间】:2011-01-19 18:34:03
【问题描述】:

在 Java 中,是否可以在接口内使用类型变量作为数组元素?

我尝试过作为归档类型和强制转换运算符,但总是得到错误

无法对非静态类型 A 进行静态引用

interface ITest<A> {
    A[] j; // Cannot make a static reference to the non-static type A
    Object[] = (A[]) new Object[3]; // Cannot make a static reference to the non-static type A
}

在任何情况下,我都可以在接口内部使用构造 A[](以及枚举类型?)?

class CTest<A> {
    enum MyEnum {
        F, G, H;
        // something that uses A[] inside. Getting the same error as above
    }
}

【问题讨论】:

    标签: java generics interface enums


    【解决方案1】:

    您可以在接口中使用泛型数组类型,如下所示:

    public interface Foo<T> {
        void doSomething(T[] array);
    }
    

    您的问题是您试图在接口中声明一个 字段,除了常量之外,您基本上无法做到这一点。您不能在接口中声明泛型数组类型的 field,但我希望您无论如何都不想这样做。

    诚然,类型擦除使数组和泛型的组合在各种情况下有些尴尬,但我认为以上内容至少回答了您提出的问题。

    【讨论】:

    • 是的,我记得那个选项。我忘了提到我试图在字段初始化器中使用A[]
    • @John:为什么要在界面中添加一个字段?这几乎总是一个坏主意。在类实现接口中有一个数组字段是一回事——但是在接口本身呢?我很难想象结果会如何。
    • 这不是我正在使用的东西。我只需要知道是否可能。
    • @John:好的,在这种情况下,答案是我不相信。基本上静态字段和泛型不能很好地结合在一起,因为每个“构造类型”都没有真正的静态变量。
    【解决方案2】:

    接口are implicitly public, static and final 中的字段,它们基本上是常量。而且你不能有依赖于类型参数的常量,因为在 Java 中参数会在编译时从类型中删除。

    顺便说一句,这与你是否使用数组无关,

    public interface X<T> {
        T c = (T)new AnyType();
    }
    

    也不行。也不会

    public class X<T> {
      public static final T c = (T)new AnyType();
    }
    

    【讨论】:

    • 我找不到 JLS 的相关部分,但成员枚举,如成员接口是隐式静态的,因此它们也不允许使用封闭类的类型信息。
    • @biziclop:你是对的。嵌套枚举是静态的。不记得了。
    • @biziclop,你的意思是在接口中定义的任何变量都是内置数据类型的,它是隐式的、静态的和最终的?还有另一个问题,你所说的“所有参数都从在编译时输入”?
    • @Alaa 是的,接口中声明的任何字段都将是 publis、static 和 final。但恐怕我无法向你解释类型擦除究竟是如何工作的,
    • @biziclop- 没问题,但是如果你找到描述它的网站,你能把它贴在这里吗?
    猜你喜欢
    • 1970-01-01
    • 2014-03-01
    • 2020-10-31
    • 2022-06-16
    • 2020-07-30
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多