如何使 Java 通用方法静态?

新手上路,请多包涵

以下是有关如何制作 java 泛型类以将单个项目附加到数组的片段。如何使 appendToArray 成为静态方法。将静态添加到方法签名会导致编译错误。

 public class ArrayUtils<E> {

        public E[] appendToArray(E[] array, E item) {
            E[] result = (E[])new Object[array.length+1];
            result[array.length] = item;
            return result;
        }
}

原文由 Chris Johnson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 425
2 个回答

您唯一能做的就是将您的签名更改为

public static <E> E[] appendToArray(E[] array, E item)

重要细节:

返回值之前的泛型表达式总是引入(声明)一个新的泛型类型变量。

此外,类型( ArrayUtils )和静态方法( appendToArray )之间的类型变量永远不会相互干扰。

So, what does this mean: In my answer <E> would hide the E from ArrayUtils<E> if the method wouldn’t be static . AND <E> 与来自 ArrayUtils<E>E --- 无关。

为了更好地反映这一事实,更正确的答案是:

 public static <I> I[] appendToArray(I[] array, I item)

原文由 scheffield 发布,翻译遵循 CC BY-SA 3.0 许可协议

public static <E> E[] appendToArray(E[] array, E item) { ...

注意 <E>

静态泛型方法需要它们自己的泛型声明( public static <E> ),与类的泛型声明( public class ArrayUtils<E> —)分开。

如果编译器在调用静态泛型方法时抱怨类型歧义(在你的情况下也不太可能,但一般来说,以防万一),这里是如何使用特定类型显式调用静态泛型方法( _class_.<_generictypeparams_>_methodname_ ):

 String[] newStrings = ArrayUtils.<String>appendToArray(strings, "another string");

这只会在编译器无法确定泛型类型时发生,因为例如泛型类型与方法参数无关。

原文由 Bert F 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题