java - 调用泛型类型

标签 java variables generics

我目前正在关注以下页面上的 Java 泛型示例: http://docs.oracle.com/javase/tutorial/java/generics/types.html

public interface Pair<K, V> {
    public K getKey();
    public V getValue();
}

public class OrderedPair<K, V> implements Pair<K, V> {

    private K key;
    private V value;

    public OrderedPair(K key, V value) {
    this.key = key;
    this.value = value;
    }

    public K getKey()   { return key; }
    public V getValue() { return value; }
}


Pair<String, Integer> p1 = new OrderedPair<String, Integer>("Even", 8);
OrderedPair<String, Integer> p1 = new OrderedPair<>("Even", 8);

我的问题是关于最后创建变量的行。一开始,一个从pair接口(interface)开始,另一个从OrderedPair类开始。使用哪一种有区别吗?我只是想理解为什么代码不同。

最佳答案

该代码无效。 Java 不允许同一作用域内有两个同名的变量。

如果名字是 p1p2 ,它们每个都引用类 OrderedPair<String,Integer> 的不同对象。在第二种情况下,您可以省略 new 中的通用参数。因为它们已经用变量的类型指定了(变量名之前的 OrderedPair<String, Integer>)。在第一种情况下,对象的类型是变量类型的子类。这对于多态性来说是有效的。通用参数被指定了两次,虽然是多余的,但也是有效的。

如上所述,p1p2 OrderedPair<String,Integer> 类型的引用对象。然而,p1p2有不同的静态(声明的)类型。在这种情况下,这意味着:

  1. 如果输入 OrderedPair有一个方法reverseOrder (只是说一下)不是继承自Pair ,然后p1.reverseOrder()无效(即使引用的对象是正确的类型,但编译器不知道这一点),但 p2.reverseOrder()将会。在这里,p2 “优于”p1 (因为您需要更多的特异性,而 p2 有它)。
  2. 如果您定义了第三种类型 UnorderedPait implements Pair ,这种类型的新实例可以分配给 p1 ,但不是p2 。在这里,p1 “优于”p2 (因为您需要更多的通用性,而 p1 拥有它)。

关于java - 调用泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18553926/

相关文章:

java - 在 IntelliJ 中构建项目时获取 "java: package com.sun.javadoc does not exist"

java - 使用唯一约束的一对一映射未按预期工作

java - 为什么显示 "The method getPreferenceOnScreen is depriciated"?

php 用一个变量创建一个变量

PHP变量名与 session 变量冲突

java - Java中根据对象类型调用子类的方法

java - 在类中实现时保留泛型

java - 链表的多项式乘法度数数学不正确

Php调用变量中类的静态方法

typescript - TypeScript 中泛型类的变量/无穷类型参数