首页 文章

如何使Java Generic方法静态?

提问于
浏览
141

以下是如何使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;
        }
}

3 回答

  • 7

    你唯一能做的就是改变你的签名

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

    Important details:

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

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

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

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

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

    注意 <E> .

    静态泛型方法需要与类的泛型声明( public class ArrayUtils<E> )分开的通用声明( public static <E> ) .

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

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

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

  • 240

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

    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;
        }
    }
    

相关问题