如何使Java通用方法静态?

以下是关于如何使Javagenerics类将单个项目追加到数组的一个片段。 我怎样才能使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; } } 

你唯一可以做的就是改变你的签名

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

重要细节:

返回值前的genericsexpression式总是引入(声明)一个新的genericstypesvariables。

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

那么,这意味着什么:如果方法不是static在我的回答<E>会隐藏EArrayUtils<E> 。 AND <E>ArrayUtils<E>E ArrayUtils<E>

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

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

注意<E>

静态generics方法需要将自己的generics声明( public static <E> )从类的generics声明( public class ArrayUtils<E> )中分离出来。

如果编译器在调用静态generics方法时抱怨types不明确(在您的情况下不太可能,但一般来说,以防万一),下面是如何使用特定types( _class_.<_generictypeparams_>_methodname_ ):

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

这只会在编译器无法确定generics时才会发生,因为genericstypes与方法参数无关。

您需要将types参数移至方法级别,以表明您具有generics方法而不是generics类:

 public class ArrayUtils { public static <T> E[] appendToArray(E[] array, E item) { E[] result = (E[])new Object[array.length+1]; result[array.length] = item; return result; } }