2016-11-08 2 views
1

приведенный ниже фрагмент кода не компилируется; У меня есть общий класс с картой, которая отображает из общего ключа K в Floats. Большинство моих методов относятся к этой карте по-настоящему общего.Метод ограничения в родовом классе конкретному типу

Кроме того, я хочу разрешить инициализацию карты с восходящими целыми значениями. Ясно, что это требует от меня ограничения метода только на K = целое. К сожалению, я получаю следующую ошибку:

The method put(K, Float) in the type Map is not applicable for the arguments (K extends Integer, Float)

Любая помощь здесь очень ценится!

public class MyClass<K> { 
    Map<K,Float> myMap; 

    <K extends Integer> MyClass(int size){ 
     distribution = new HashMap<K,Float>(); 
     Integer bar = 0; 
     while(bar<size){ 
      Float rnd = ThreadLocalRandom.current().nextFloat(); 
      myMap.put(bar,rnd); 
      bar++; 
     } 
    } 
} 
+1

есть не 'return' в' метод SparsePDT' o.o – ItamarG3

+4

Вы знаете, что 'Integer' объявлен' final'? –

+0

@ItamarGreen спасибо, это был всего лишь артефакт, прежде чем уменьшить это до примера игрушек. Этот метод фактически является конструктором. – Chris

ответ

4

Вы можете расширить свой класс и указать тип параметра для базового класса:

class MyClass<K> { 
    Map<K,Float> myMap; 
} 
class Derived extends MyClass<Integer>{ 
    void SparsePDT(int size){ 
     myMap = new HashMap<Integer,Float>(); 
     Integer bar = 0; 
     while(bar<size){ 
      Float rnd = ThreadLocalRandom.current().nextFloat(); 
      myMap.put(bar,rnd); 
      bar++; 
     } 
    } 
} 

Это делает класс «MyClass» доступны, чтобы остаться полностью родовым, а также использовать его карта с типом Integer.
Для получения дополнительной информации о , охватывающих общие классы, вы можете прочитать here.
Надеюсь, это поможет.

+0

В C++ я бы присвоил свой метод «template :: значение, int> :: type = 0>" - расширяет класс только альтернатива в Java? – Chris

+1

В Java generics менее мощная функция, а затем в C++. Это потому, что они были включены на этот язык довольно поздно, а Java обратно совместима. Если вы хотите, чтобы ваш класс «MyClass» был полностью общим, это решение (и тому подобное) является единственным, что приходит мне на ум. –

1

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

class MyClass<K> { 
    private final Map<K, Float> myMap; 

    public MyClass() { 
     myMap = new HashMap<>(); 
    } 

    public static MyClass<Integer> create(int size) { 
     MyClass<Integer> result = new MyClass<>(); 
     for(int i = 0; i < size; i++) { 
      Float rnd = ThreadLocalRandom.current().nextFloat(); 
      result.myMap.put(bar,rnd); 
     } 
     return result; 
    } 
} 
Смежные вопросы