【问题标题】:Type parameter in Java generic methodsJava泛型方法中的类型参数
【发布时间】:2017-10-12 16:31:57
【问题描述】:

这是一个初学者的问题。关于声明一个泛型方法,在返回类型前面有一个类型参数有什么意义?让我简单引用 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&lt;K, V&gt; p1Pair&lt;K, V&gt; p2,我们希望方法返回一个boolean类型的值。假设我们最关心的是返回值,为什么还要在方法声明中显式插入类型参数&lt;K, V&gt;

【问题讨论】:

  • @M.leRutte 这是怎么重复的?
  • @M. le Rutte 我非常不同意你关于我的问题重复的建议。
  • 我同意。结束得太快了。

标签: java generics


【解决方案1】:

为什么还要在方法声明中显式插入类型参数&lt;K, V&gt;

我们不必这样做。

首先,您根本不需要类型参数。你可以写:

public static boolean compare(Entry p1, Entry p2) {
    return p1.getKey().equals(p2.getKey()) && p1.getValue().equals(p2.getValue());
}

但如果Entry 是泛型的,您会得到“对泛型类型的引用......应该被参数化。”

如果你想避免警告,你可以这样做:

public static boolean compare(Entry<?, ?> p1, Entry<?, ?> p2) {
    return p1.getKey().equals(p2.getKey()) && p1.getValue().equals(p2.getValue());
}

这完全没问题,没有&lt;K, V&gt; 并且没有给出原始类型警告。那么为什么你需要&lt;K, V&gt; 呢?在这种情况下,&lt;K, V&gt; 的重点可能是确保Entry 中的键具有相同的类型K 和相同类型的值V(即与其分配兼容)。在这种情况下,它在技术上并没有太大的区别(equals 无论如何都会以相同的方式工作),但它可能有助于确保您不会将苹果与香蕉进行比较。

【讨论】:

  • 很好的答案非常感谢。那么在以下情况下使用的类型参数是什么,比如public static boolean someMethod(Entry1&lt;K, V&gt; p1, Entry2&lt;U, V&gt; p2),这意味着一个方法接受两种不同的泛型类型,它们可能有一些可以比较的成员。
  • @Xavier 又来了?
【解决方案2】:

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

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

public static boolean compare(Pair<?, ?> p1, Pair<?, ?> p2)

但是您可以使用一对&lt;String, Integer&gt; 和一对&lt;Boolean, Double&gt; 调用compare,它们永远不会相等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多