如何使Java泛型方法成为静态的?

如何使Java泛型方法成为静态的?,java,generics,Java,Generics,下面是一个关于如何使java泛型类将单个项附加到数组的片段。如何使appendToArray成为静态方法。向方法签名添加static会导致编译错误 public class ArrayUtils<E> { public E[] appendToArray(E[] array, E item) { E[] result = (E[])new Object[array.length+1]; result[array.len

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

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;
        }
}
公共类数组直到{
公共E[]附件数组(E[]数组,E项){
E[]结果=(E[])新对象[array.length+1];
结果[array.length]=项;
返回结果;
}
}

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

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

您需要将类型参数移动到方法级别,以指示您具有泛型方法而不是泛型类:

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;
    }
}
公共类数组直到{
公共静态E[]appendToArray(E[]数组,E项){
E[]结果=(E[])新对象[array.length+1];
结果[array.length]=项;
返回结果;
}
}
公共静态E[]附件数组(E[]数组,E项){。。。
请注意

静态泛型方法需要自己的泛型声明(
publicstatic
)与类的泛型声明(
publicsclassarrayutils
)分开

如果编译器在调用静态泛型方法时抱怨类型不明确(在您的情况下也不太可能,但一般来说,只是以防万一),下面介绍如何使用特定类型(
\u class.\u methodname.
)显式调用静态泛型方法:

String[]newStrings=ArrayUtils.appendToArray(strings,“另一个字符串”);

只有当编译器无法确定泛型类型时才会发生这种情况,例如,泛型类型与方法参数无关。

我将用一种简单的方式解释它

在类级别定义的泛型与在(静态)方法级别定义的泛型完全分开

class Greet<T> {

    public static <T> void sayHello(T obj) {
        System.out.println("Hello " + obj);
    }
}
JVM将其解释为以下内容

Greet.<String>sayHello("Bob");
Greet.<Integer>sayHello(123);

你会遇到什么编译错误?还有,为什么不使用一个标准的库容器呢?编译错误:我实际上添加的静态修饰符不正确..使用集合:是的,使用集合将是理想的,但问题不在于集合与数组,我的用例需要一个数组。请注意,你需要使用(邪恶)在某些但不是所有情况下停止客户端代码抛出异常的反射(很好)最好避免引用数组。请注意,类级别类型变量<代码> e < /> >与静态方法类型变量<代码> e < /代码>之间完全没有关系。我认为在泛型类中声明泛型方法静态或其他方式时,使用不同的变量名要好得多。.但在这种情况下,我可以将一个不同类型的对象传递到参数中。就像我可以传递Integer[]array as first param and Double item.PinkPartner:True,但它不会造成任何伤害,因为静态方法仅对通过参数传递给它的数组对象进行操作,因此其元素的类型必须正确。这将不起作用,因为您尚未定义泛型类型E。在这种情况下,您仍然必须使用泛型键入类定义。
String[] newStrings = ArrayUtils.<String>appendToArray(strings, "another string");
class Greet<T> {

    public static <T> void sayHello(T obj) {
        System.out.println("Hello " + obj);
    }
}
class Greet<T> {

    public static <E> void sayHello(E obj) {
        System.out.println("Hello " + obj);
    }
}
Greet.sayHello("Bob");
Greet.sayHello(123);
Greet.<String>sayHello("Bob");
Greet.<Integer>sayHello(123);
Hello Bob
Hello 123