如何使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>
会隐藏E
从ArrayUtils<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; } }