为什么我们必须在方法返回类型之前提到泛型类型参数?

时间:2014-10-02 23:39:07

标签: java generics

在这个page上,它有以下代码示例来介绍泛型方法?

public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
    return p1.getKey().equals(p2.getKey()) &&
           p1.getValue().equals(p2.getValue());
}
  1. 我有一个问题,为什么我们需要在&#39; boolean&#39;之前提到泛型。这里?这个方法只是返回布尔类型..当我删除<K, V>编译器时抛出错误cannot make a static reference to the non-static type K

    public void setValue(V value) {
        this.value = value;
    }
    
  2. 在同一个链接上,我们有上述方法,那么为什么我们这里没有提到<V>提到的泛型类型参数?

  3. 编辑:在此处发布已完成的代码,以便更好地了解我的问题:

    Util.Java

    public class Util {
        // Generic static method
        public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
            return p1.getKey().equals(p2.getKey()) &&
                   p1.getValue().equals(p2.getValue());
        }
    }
    

    Pair.Java

    public class Pair<K, V> {
    
        private K key;
        private V value;
    
        // Generic constructor
        public Pair(K key, V value) {
            this.key = key;
            this.value = value;
        }
    
        // Generic methods
        public void setKey(K key) { this.key = key; }
        public void setValue(V value) { this.value = value; }
        public K getKey()   { return key; }
        public V getValue() { return value; }
    }
    

5 个答案:

答案 0 :(得分:3)

如果类未声明泛型类型,则该方法将不知道您请求的类型。静态通常就是这种情况,因为这些方法不是类实例的一部分。

类上泛型参数的范围仅属于实例方法和字段。静态方法必须仅为其范围声明自己的类型参数。

来自The Java™ Tutorials: Generic Methods

  

通用方法是引入自己的类型参数的方法。这类似于声明泛型类型,但类型参数的范围仅限于声明它的方法。允许使用静态和非静态泛型方法,以及泛型类构造函数。

您的示例似乎来自此页面,您拥有该页面上所需的所有信息。如果您需要了解有关泛型的更多信息,请继续学习本教程。 : - )

对于您的第二个问题,setValue()方法是Pair类的成员,该类提供KV类型参数:

public class Pair<K, V> {
    private V value;
    public void setValue(V value) { this.value = value; }
    public V getValue() { return value; }
}

V在实例范围内声明。

答案 1 :(得分:0)

在Java中有两种声明和使用泛型类型参数的方法。

  1. compare方法类似,您可以在方法本身上声明类型参数。这些是在返回类型之前声明的,并且可以在整个方法中使用它们。

  2. setValue方法类似,未在方法上声明的类型参数必须在其他地方声明 - 在类声明本身上。在setValue方法的课程中,您会看到如下内容:

  3. 对:

    public class Pair<K, V> {
    

    这是声明类范围泛型类型参数的地方。它们在整个班级的范围内,包括setValue方法。

    例外是这样的类级别类型参数不在static方法的范围内,因此必须在static方法上声明它们在范围内。请注意,它们将是与类中声明的类型参数不同的类型参数。

答案 2 :(得分:0)

  

为什么我们必须在方法返回类型之前提及泛型类型参数?

因为返回类型可能使用其中一种泛型类型,并且因为该方法是静态的,所以它不会“看到”包含类的泛型类型。

  

在同一个链接上,我们有上面的方法,为什么我们这里没有提到的泛型类型参数?

因为它必须包含在泛型类中。

答案 3 :(得分:0)

您的问题与方法泛型参数有关,这些参数在返回类型之前声明为 - 这是必要的,因为返回类型可能是,并且通常是基于通用类型。

答案 4 :(得分:0)

您必须提及通用类型,否则KV将被解释为具体的classinterface。该程序无法编译,因为无法找到KV。在方法之前添加泛型告诉编译器这些类是泛型的。如果在调用时输入的类型无法推断它们,则需要像下面这样提及:

Foo.<String>createFoo();

您(n&#t; t)返回从泛型派生的对象的事实并不是这些要求的全部原因。