我目前正在关注以下页面上的 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 不允许同一作用域内有两个同名的变量。
如果名字是 p1
和p2
,它们每个都引用类 OrderedPair<String,Integer>
的不同对象。在第二种情况下,您可以省略 new
中的通用参数。因为它们已经用变量的类型指定了(变量名之前的 OrderedPair<String, Integer>
)。在第一种情况下,对象的类型是变量类型的子类。这对于多态性来说是有效的。通用参数被指定了两次,虽然是多余的,但也是有效的。
如上所述,p1
和p2
OrderedPair<String,Integer>
类型的引用对象。然而,p1
和p2
有不同的静态(声明的)类型。在这种情况下,这意味着:
- 如果输入
OrderedPair
有一个方法reverseOrder
(只是说一下)不是继承自Pair
,然后p1.reverseOrder()
无效(即使引用的对象是正确的类型,但编译器不知道这一点),但p2.reverseOrder()
将会。在这里,p2
“优于”p1
(因为您需要更多的特异性,而p2
有它)。 - 如果您定义了第三种类型
UnorderedPait implements Pair
,这种类型的新实例可以分配给p1
,但不是p2
。在这里,p1
“优于”p2
(因为您需要更多的通用性,而p1
拥有它)。
关于java - 调用泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18553926/