Java 泛型方法类型参数声明

Java 泛型方法类型参数声明,java,generics,Java,Generics,因此,good ol'Ditel指出,“所有泛型方法声明都有一个类型参数部分,由方法返回类型前面的尖括号()分隔,”(Deitel,2012,斜体强调)。给出的示例如下: public static < T > void printArray (T[] inputArray) { for (T element : inputArray) ( System.out.printlf("%s", element); } 那么,就这么定了。EclipseID

因此,good ol'Ditel指出,“所有泛型方法声明都有一个类型参数部分,由方法返回类型前面的尖括号()分隔,”(Deitel,2012,斜体强调)。给出的示例如下:

public static < T > void printArray (T[] inputArray)
{
    for (T element : inputArray)
    (
        System.out.printlf("%s", element);
}
那么,就这么定了。EclipseIDE在我尝试编译(Intellisense的Java版本)之前给了我一个警告,指出“类型参数F正在隐藏类型F”。现在,我并不特别信任Ditel for Java,并且逐渐了解到它们并不特别可靠(因为它们经常忽略重要的区别)。所以,我去了我正在做的事情,猜猜看,他们没有提到这类内容,除非你在谈论“上限”类型参数

问题是(有三个方面):

  • 这里的区别是“静态”限定符,即我正在编写的方法出现在类中吗
  • 迪特尔到底在做什么,尤其是在实施他们的建议时,这里会产生一个警告
  • 通过更改类类型参数,我消除了警告。那么,从概念上讲,在方法参数类型“隐藏”类参数类型的地方发生了什么

  • JLS专门指定一个泛型方法作为声明类型参数的方法。()所以这里的混淆是Deital说“所有泛型方法都有一个类型参数部分”,但可能没有明确指出这是它们的定义。更清楚地说,“泛型方法是具有类型参数部分的方法”

    如注释中所述,当类声明了类型参数时,不需要在方法中重新声明它们。正如Eclipse所指出的,这样做实际上声明了新的类型参数,隐藏了类声明的类型参数

    在类上声明它们时,您可以直接使用它们:

    class Pair<F, S> {
        F getF() { ... }
        S getS() { ... }
        void setF(F f) { ... }
        void setS(S s) { ... }
    }
    
    理解泛型方法使用的最简单示例是其实现,如下所示:

    public static <T> T requireNonNull(T obj) {
        if(obj == null)
            throw new NullPointerException();
        return obj;
    }
    

    这是最简单的泛型方法。

    如果它是在类级别上定义的,则不必在方法级别上定义它。泛型方法和泛型类之间有区别。@Jeroenvanevel谢谢,这就是我想要的明确区别。实际上,如果我读下一章的话,可能会有所帮助。他们似乎已经纠正了自己,谢谢你花时间回答!精彩的。
    class Pair<F, S> {
        F getF() { ... }
        S getS() { ... }
        void setF(F f) { ... }
        void setS(S s) { ... }
    }
    
    public static void printArray(Object[] arr) {
        for(Object o : arr) {
            System.out.printf("%s", o);
        }
    }
    
    public static <T> T requireNonNull(T obj) {
        if(obj == null)
            throw new NullPointerException();
        return obj;
    }
    
    // T is inferred
    String hello = Objects.requireNonNull("hello world");
    // T is provided as a witness (rarely necessary)
    Integer five = Objects.<Integer>requireNonNull(5);