2015-09-19 2 views
1

Я реализую алгоритм взвешенной вероятности, поэтому я создал общий класс Pair. Поскольку вероятность вычисляется с использованием чисел, значение Pair всегда будет Integer, но я хотел, чтобы он работал так, чтобы ключ мог быть любым Object. Это то, что я получил:Общая пара с одним известным классом?

class Pair<K, Integer> { 
    public K k; 
    public java.lang.Integer v; 

    public Pair(K k, java.lang.Integer v) { 
     this.k = k; 
     this.v = v; 
    } 

    // getters and other stuff 
} 

Он отлично работает, но я нахожу это странным, что независимо от того, что я типа вместо Integer частей в первой строке, она работает так же. Я что-то упускаю? Есть ли лучший способ сделать это?

ответ

1

Способ использования, Integer - только переменная типа, такая же, как K.

Если вам не нужен тип второго значения пары будет параметр, то не объявим его в качестве параметра типа, а просто использовать Integer в коде:

class IntPair<K> { 
    private K first; 
    private Integer second; 

    public Integer someIntegerSpecificFunction() { 
     // do stuff to internalPair.second 
    } 

    K getFirst() { 
     return first; 
    } 

    Integer getSecond() { 
     return second; 
    } 
} 
3
class Pair<K, Integer> 

эквивалентно

class Pair<K, V> 

где имя второго обобщенного параметра произойдет бы быть Integer вместо V (и, таким образом, скрывая тип java.lang.Integer, который заставляет вас использовать java.lang.Integer вместо Integer в коде, чтобы избежать конфликта).

Ваш класс должен иметь только один общий параметр:

class Pair<K> 
+0

Еще один вопрос, что, если я хочу сделать, допустим, 'TreeMap '? – shooqie

+0

Зачем вам это делать? JDK поставляется со стандартным классом TreeMap. Используйте его вместо того, чтобы изобретать его. –

2

Вы используете generics, когда вы можете принять любой тип. Но так как вы знаете, что этот тип будет Integer, вам не нужно это делать generic.

Новая версия с одним родовым типом аргумента будет выглядеть следующим образом:

public class Pair<T> { 
    public T t; 
    public int v; 
    public Pair(T t, int v) { 
     this.t = t; 
     this.v = v; 
    } 
    // ... 
} 

Это хорошая практика, когда у вас есть только один общий аргумент типа, назвать его с буквой «Т». Также вы можете использовать int вместо Integer.

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