2012-08-22 27 views
1

我有以下interface如何使用比較<T>?

public interface Identifiable { 

    public Comparable<?> getIdentifier(); 

} 

而實現類

public class Agreement implements Identifiable { 

    private Long id; 

    public Comparable<Long> getIdentifier() { 
     return id; 
    } 
} 

編輯:請注意,可能還有其他的實現與不同類型的標識符。
現在,我想,是的,比較可比:

// Agreement a; 
// Agreement b; 
... 
if (a.getIdentifier().compareTo(b.getIdentifier()) { 
... 

compareTo給了我下面的編譯器錯誤:

的類型的方法的compareTo(龍)可比<朗>是不適用於參數(可比較<長>)

這個接口應該如何與泛型一起使用?

回答

10

Comparable<T>是爲了用作上限的通用參數:

public interface Identifiable<T extends Comparable<T>> {  
    public T getIdentifier(); 
} 

public class Agreement implements Identifiable<Long> { 

    private final Long id; 

    public Long getIdentifier() { 
     return id; 
    } 
} 

這迫使返回類型爲T,不只是一朝一夕所能相比T


您的代碼本質上是不安全的。
要理解爲什麼,考慮下面的代碼:

class Funny implements Comparable<Long> { ... } 
class Funnier implements Identifiable { 
    public Comparable<Long> getIdentifier() { 
     return new Funny(); 
    } 
} 

Identifiable<Funny> funnier; 
funnier.getIdentifier().compareTo(funnier.getIdentifier()); 
// You just tried to pass a Funny to compareTo(Long) 
+0

你的榜樣讓我大開眼界。謝謝! – Zeemee

+0

我認爲這裏的界限並不是「下」,而是上界,對嗎? –

+0

@Mulmoth我第一次看到'>'我的眼睛也很寬。 ;) –