2013-08-31 55 views
0

我目前按照下页上的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); 

我的问题是关于在其中创建变量到底线。一开始,一开始是对接口,而另一开始于OrderedPair类。是否有区别使用哪一个?我只是想明白为什么代码是不同的。

+0

'<>'语法的类型推断:http://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html#type-in​​ference-instantiation(如果这就是你问的问题。你真的不明白你的意思。) – millimoose

回答

0

第一个使用Pair的参考。有了这个,你可以指向对接口的任何实现 - OrderedPair,SortedPair,LongPair等

但与第二参考,你只能点OrderedPair

2

代码的目的是无效的。 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)。
+0

@millimoose所以我想在看到你的评论前毫秒。 –

+0

Aaanyway。 “这是每个多态性都有效的,但强制你指定泛型参数两次。”是不正确的,尽管OP的代码看起来就是这样。 '列表 strings = new ArrayList <>();'例如。 (实际上,更复杂的情况是:http://ideone.com/EWKpsw。) – millimoose

+0

@millimoose更正完成。感谢您的关注。 –

0

如果有在未在Pair界面中列出的OrderedPair类的方法,那么你需要为了叫他们OrderedPair类型的表达式。换句话说,您想要将变量声明为OrderedPair,然后调用该变量上的方法。另一方面,如果您只使用Pair界面中列出的方法,则可以将变量声明为Pair,并调用其中的方法。有两个原因,你可能想要做后者。

  • Pair类型的变量可以引用实现Pair其他类的对象 - 你可能有UnorderedPairPrettyPair等等,是不是OrderedPair子类。
  • 它告诉您的程序的未来维护者,您只使用该变量的Pair方法 - 将不会使用特定于OrderedPair的任何方法。