在Java泛型方法中键入参数

时间:2017-10-12 08:16:34

标签: java generics

这是一个初学者的问题。关于声明泛型方法,在返回类型前面有一个类型参数是什么意思?我只想引用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> p1Pair<K, V> p2,我们希望该方法返回值{{ 1}}类型。由于我认为我们主要关心的是返回值,为什么我们仍然需要在方法声明中显式插入类型参数boolean

2 个答案:

答案 0 :(得分:1)

您的方法有两个参数p1p2,两个参数都使用类型参数KV。通过这样做,编译器可以帮助您确保两个参数实际上使用相同的泛型类型。

如果您不需要,可以将方法签名更改为

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无论如何都会以相同的方式工作),但它可能有助于确保您不会将苹果与香蕉进行比较。