这是一个初学者的问题。关于声明泛型方法,在返回类型前面有一个类型参数是什么意思?我只想引用Oracle Java教程中的示例
public class Util {
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<K, V> p1
和Pair<K, V> p2
,我们希望该方法返回值{{ 1}}类型。由于我认为我们主要关心的是返回值,为什么我们仍然需要在方法声明中显式插入类型参数boolean
?
答案 0 :(得分:1)
您的方法有两个参数p1
和p2
,两个参数都使用类型参数K
和V
。通过这样做,编译器可以帮助您确保两个参数实际上使用相同的泛型类型。
如果您不需要,可以将方法签名更改为
public static boolean compare(Pair<?, ?> p1, Pair<?, ?> p2)
但是您可以使用一对compare
和一对永远不会相等的<String, Integer>
来致电<Boolean, Double>
。
答案 1 :(得分:1)
为什么我们仍然需要在方法声明中显式插入类型参数
<K, V>
?
我们没有必要。
首先,您根本不需要类型参数。你可以写:
public static boolean compare(Entry p1, Entry p2) {
return p1.getKey().equals(p2.getKey()) && p1.getValue().equals(p2.getValue());
}
但如果Entry
是通用的,那么您将获得&#34;对泛型类型的引用......应该参数化。&#34;
如果你想避免警告,你可以这样做:
public static boolean compare(Entry<?, ?> p1, Entry<?, ?> p2) {
return p1.getKey().equals(p2.getKey()) && p1.getValue().equals(p2.getValue());
}
哪个完全没问题,没有<K, V>
并且没有给出原始类型警告。那么为什么你需要<K, V>
呢?在这种情况下<K, V>
点可能是为了确保Entry
中的密钥具有相同类型K
和相同类型V
的值(即分配兼容)它)。在这种情况下,它在技术上没有太大的区别(equals
无论如何都会以相同的方式工作),但它可能有助于确保您不会将苹果与香蕉进行比较。