在这个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());
}
我有一个问题,为什么我们需要在&#39; boolean&#39;之前提到泛型。这里?这个方法只是返回布尔类型..当我删除<K, V>
编译器时抛出错误cannot make a static reference to the non-static type K
。
public void setValue(V value) {
this.value = value;
}
在同一个链接上,我们有上述方法,那么为什么我们这里没有提到<V>
提到的泛型类型参数?
编辑:在此处发布已完成的代码,以便更好地了解我的问题:
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; }
}
答案 0 :(得分:3)
如果类未声明泛型类型,则该方法将不知道您请求的类型。静态通常就是这种情况,因为这些方法不是类实例的一部分。
类上泛型参数的范围仅属于实例方法和字段。静态方法必须仅为其范围声明自己的类型参数。
通用方法是引入自己的类型参数的方法。这类似于声明泛型类型,但类型参数的范围仅限于声明它的方法。允许使用静态和非静态泛型方法,以及泛型类构造函数。
您的示例似乎来自此页面,您拥有该页面上所需的所有信息。如果您需要了解有关泛型的更多信息,请继续学习本教程。 : - )
对于您的第二个问题,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; }
}
V
在实例范围内声明。
答案 1 :(得分:0)
在Java中有两种声明和使用泛型类型参数的方法。
与compare
方法类似,您可以在方法本身上声明类型参数。这些是在返回类型之前声明的,并且可以在整个方法中使用它们。
与setValue
方法类似,未在方法上声明的类型参数必须在其他地方声明 - 在类声明本身上。在setValue
方法的课程中,您会看到如下内容:
对:
public class Pair<K, V> {
这是声明类范围泛型类型参数的地方。它们在整个班级的范围内,包括setValue
方法。
例外是这样的类级别类型参数不在static
方法的范围内,因此必须在static
方法上声明它们在范围内。请注意,它们将是与类中声明的类型参数不同的类型参数。
答案 2 :(得分:0)
为什么我们必须在方法返回类型之前提及泛型类型参数?
因为返回类型可能使用其中一种泛型类型,并且因为该方法是静态的,所以它不会“看到”包含类的泛型类型。
在同一个链接上,我们有上面的方法,为什么我们这里没有提到的泛型类型参数?
因为它必须包含在泛型类中。
答案 3 :(得分:0)
您的问题与方法泛型参数有关,这些参数在返回类型之前声明为 - 这是必要的,因为返回类型可能是,并且通常是基于通用类型。
答案 4 :(得分:0)
您必须提及通用类型,否则K
和V
将被解释为具体的class
或interface
。该程序无法编译,因为无法找到K
和V
。在方法之前添加泛型告诉编译器这些类是泛型的。如果在调用时输入的类型无法推断它们,则需要像下面这样提及:
Foo.<String>createFoo();
您(n&#t; t)返回从泛型派生的对象的事实并不是这些要求的全部原因。