Общая функция с ограничением интерфейса [dубликат]

Карта

Можете ли вы использовать реализацию Map , такую ​​как HashMap ?

  ]  import java.util.HashMap;  import java.util.Map;  public class test {public static void main (String [] args) {// Заполните вашу структуру карты Map & lt; String, Integer & gt;  theMap = new HashMap & lt; String, Integer & gt; ();  for (int i = 1; i & lt; = 100; i ++) {theMap.put ("a" + i, i);  } // После этого вы можете получить доступ ко всем своим значениям System.out.println ("a55 value:" + theMap.get ("a55"));  }}  

Выход программы:

  Значение a55: 55  

10
задан Lieven Keersmaekers 13 December 2010 в 08:17
поделиться

2 ответа

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

Имя интерфейса преобразуется в GUID компилятором, который ищет имя в таблице символов, получает структуру данных компилятора, представляющую интерфейс, и проверяет соответствующее поле для GUID. Но generics не похожи на шаблоны C ++; они должны быть скомпилированы и проверены по типу и известны для работы для любого допустимого параметра типа, а это означает ограничение параметра типа в его объявлении.

Вы можете получить GUID с помощью RTTI (сначала проверяя, что T на самом деле представляют интерфейс) с чем-то вроде GetTypeData (TypeInfo (T)) ^. Guid и передать GUID на таким образом поддерживает .

10
ответ дан Barry Kelly 15 August 2018 в 17:29
поделиться
  • 1
    не можете ли вы применить ограничение, что T должен быть определенным интерфейсом с GUID? – David Heffernan 11 December 2010 в 20:48
  • 2
    Если это должен быть какой-то интерфейс, тогда код не является общим. Поддержка вернет ссылку на интерфейс; компилятор не может в общем случае превратить это во все, что есть. – Barry Kelly 12 December 2010 в 06:10
  • 3
    Барри, спасибо за вашу помощь. Большая часть моего опыта работы с общим программированием была на фоне C ++, и я ожидал, что компилятор узнает, имеет ли интерфейс Guid так же, как он знал бы, если бы имя интерфейса было предоставлено напрямую. Теперь имеет смысл понять, что generics & lt; gt; Шаблоны C ++. Еще раз спасибо. – Chad 12 December 2010 в 08:45

Почему вы даже беспокоитесь?

Чтобы использовать этот TFunctions.GetInterface, вам нужно:

  • интерфейс
  • ссылку на объект
  • ]

Если у вас есть это, вы можете просто вызвать Supports () напрямую:

  intf: = TFunctions.GetInterface & lt; IMyInterface & gt; (myObject);   

является точно , эквивалентным:

  Поддерживает (IMyInterface, myObject, intf);   

Использование дженериков здесь пустая трата времени и усилий и действительно задает вопрос «Зачем это делать?».

Это просто усложняет чтение (как так как это часто случается с дженериками) и является более громоздким в использовании.

Supports () возвращает удобное логическое значение для указания успеха / отказа, которое вы должны тестировать отдельно с помощью вашей обертки:

  intf: = TFunctions.GetInterface & lt; IMyInterface & gt; (myObject);  Если Assigned (intf), то // ...  

против:

 , если поддерживает (IMyInterface, myObject, intf), то // Мы можем использовать intf   

При создании оберток вокруг функциональности обычно бывает, что результатом является улучшение читабельности или удобства использования.

imho это не работает по обоим пунктам, и вы должны просто придерживаться с самой поддержкой функции Supports ().

2
ответ дан Deltics 15 August 2018 в 17:29
поделиться
  • 1
    Мой пример перегоняется из фактического контекста, чтобы задать конкретный вопрос и не является иллюстрацией фактического дизайна. – Chad 12 December 2010 в 08:38
  • 2
    Затем вам нужно предоставить хотя бы НЕКОТОРЫЕ из контекста. В противном случае это похоже на вопрос о том, как добраться от A до B, не упоминая, что вы не можете ездить и не иметь денег на проезд в автобусе. Возможно, даже в том контексте, что вы делаете, это не лучший / самый простой способ этого. Все хорошо и хорошо, задавая конкретный вопрос, но если вы хотите получить полезные ответы, то не стоит выбрасывать важный контекст. – Deltics 12 December 2010 в 09:42
  • 3
    Я почтительно не согласен. Приветствия. – Chad 12 December 2010 в 18:38
  • 4
    Как и ваше право. Удачи вам в том, что вы делаете. Мы можем только надеяться, что вы не тратите свое время. ;) – Deltics 13 December 2010 в 00:47
Другие вопросы по тегам:

Похожие вопросы: