2010-10-29 2 views
1

Дано:Компаратор для универсального интерфейса без предупреждения

public interface PrimaryKey<Key extends Comparable> { 
    Key getKey(); 
} 

и

public class PrimaryKeyComparator implements Comparator<PrimaryKey> { 
    public int compare(PrimaryKey first, PrimaryKey second) { 
     return first.getKey().compareTo(second.getKey()); 
    } 
} 

Эта комбинация работает, но дает предупреждения о сырых типов. Я пробовал различные способы добавления аргументов типа, но каждая попытка, которую я попытался, нарушает код.

+2

Использование '' Key' и TKey' как родовые заполнители действительно простой способом, чтобы запутать человек читать ваш код. Причина в том, что Java использует имена 'E',' T', 'K' и' V' как имена заполнителей. – Powerlord

+0

Абсолютно согласен с R. Bemrose. 'Key' выглядит как имя класса или интерфейса. – ColinD

ответ

3

Попробуйте это:

public interface PrimaryKey<TKey extends Comparable<TKey>> { 
    TKey getId(); 
} 

public class PrimaryKeyComparator<TKey extends Comparable<TKey>> 
           implements Comparator<PrimaryKey<TKey>> { 
    public int compare(PrimaryKey<TKey> first, PrimaryKey<TKey> second) { 
     return first.getId().compareTo(second.getId()); 
    } 
} 
+0

Удивительный! Спасибо. –

+5

Общий параметр 'TKey' должен быть действительно' > ', который позволяет использовать классы, которые реализуют raw' Comparable', а не 'Comparable ' или подклассы класса 'Comparable '. – ColinD

Смежные вопросы