Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我们必须在方法返回类型之前提到泛型类型参数?_Java_Generics - Fatal编程技术网

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

Java 为什么我们必须在方法返回类型之前提到泛型类型参数?,java,generics,Java,Generics,在这里,它有下面的代码示例来介绍泛型方法 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()); } 在同一个链接上,我们有上面的方法,那么我们为什么不在这里使用泛型类型参数

在这里,它有下面的代码示例来介绍泛型方法

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());
}
  • 在同一个链接上,我们有上面的方法,那么我们为什么不在这里使用泛型类型参数

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

    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());
        }
    }
    
    公共类Util{
    //通用静态法
    公共静态布尔比较(对p1,对p2){
    返回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; }
    }
    
    公共类对{
    私钥;
    私人价值;
    //泛型构造函数
    公共对(K键,V值){
    this.key=key;
    这个值=值;
    }
    //通用方法
    public void setKey(K key){this.key=key;}
    public void setValue(V值){this.value=value;}
    public K getKey(){return key;}
    public V getValue(){return value;}
    }
    
    如果类没有声明泛型类型,则方法将不知道您请求的类型。这通常是静态的情况,因为这些方法不是类实例的一部分

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

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

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

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

    public class Pair<K, V> {
        private V value;
        public void setValue(V value) { this.value = value; }
        public V getValue() { return value; }
    }
    
    公共类对{
    私人价值;
    public void setValue(V值){this.value=value;}
    public V getValue(){return value;}
    }
    

    V
    在实例的范围内声明。

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

  • compare
    方法类似,您可以在方法本身上声明类型参数。它们在返回类型之前声明,可以在整个方法中使用

  • setValue
    方法类似,未在方法上声明的类型参数必须在其他地方声明——在类声明本身上。在
    setValue
    方法的类中,可以看到如下内容:

  • 配对:

    公共类对{
    
    这是声明类作用域泛型类型参数的地方。它们在整个类的作用域中,包括
    setValue
    方法

    例外情况是此类类级别的类型参数不在
    静态
    方法的作用域中,因此必须在
    静态
    方法中声明它们才能在作用域中。请注意,它们将是与类上声明的类型参数不同的类型参数

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

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

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


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

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

    您必须提及泛型类型,否则
    K
    V
    将每个类都可以解释为一个具体的
    接口
    。程序不会编译,因为找不到
    K
    V
    。在方法之前添加泛型会告诉编译器这些类是泛型。如果调用时无法根据输入的类型推断这些类,则需要提及它是这样的:

    Foo.<String>createFoo();
    
    Foo.createFoo();
    

    事实上你是(不是)返回从泛型派生的对象并不是这些要求的全部原因。

    它是静态的。请参见此处:@user2588666:此问题的反面是:我无法复制您的错误消息。如果我从方法中删除
    ,我会得到
    错误:找不到符号公共静态布尔比较(对p1,对p2){符号:k类,位置:类UTIL/CODE>。考虑发布会让我们复制你的实际问题。总之,如果你想在方法中使用泛型类型,但是你没有通过“代码>类YouClass public class Pair<K, V> {
    
    Foo.<String>createFoo();