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