Каков эквивалент подстановочных знаков Java в дженериках C#

Вы можете попробовать docker exec -it $your_container_id bash.

Документы предоставляют больше информации о том, что он делает, и обо всех параметрах. Но он должен работать в любом формате, который у вас есть в Dockerfile.

20
задан p.s.w.g 26 November 2013 в 17:38
поделиться

5 ответов

Нормальный способ сделать это должно было бы сделать метод универсальным:

public void ProcessItems<T>(Item<T>[] items) {
  foreach(Item<T> item in items)
    item.DoSomething();
}

Принятие вызывающая сторона знает тип, вывод типа должен означать, что они не должны явно указывать его. Например:

Item<int> items = new Item<int>(); // And then populate...
processor.ProcessItems(items);

Однако создавая неуниверсальный интерфейс, указывающий агностические типом операции, может быть полезным также. Это будет очень зависеть от Вашего точного варианта использования.

25
ответ дан 30 November 2019 в 00:40
поделиться

Я вижу, что Вы только хотите вызвать некоторый метод без параметров... уже существует контракт для этого: Action.

public void processItems(IEnumerable<Action> actions)
{
  foreach(Action t in actions)
    t();
}

Клиент:

List<Animal> zoo = GetZoo();
List<Action> thingsToDo = new List<Action>();
//
thingsToDo.AddRange(zoo
  .OfType<Elephant>()
  .Select<Elephant, Action>(e => e.Trumpet));
thingsToDo.AddRange(zoo
  .OfType<Lion>()
  .Select<Lion, Action>(l => l.Roar));
thingsToDo.AddRange(zoo
  .OfType<Monkey>()
  .Select<Monkey, Action>(m => m.ThrowPoo));
//
processItems(thingsToDo);
3
ответ дан 30 November 2019 в 00:40
поделиться

Нет никакого способа, которым можно опустить Параметры Типа в.NET универсальная реализация; это дизайном. На самом деле это может только быть достигнуто в Java из-за его основанной на типе-стиранием реализации.

можно только использовать основной неуниверсальный интерфейс (думайте IEnumerable<T> и IEnumerable).

1
ответ дан 30 November 2019 в 00:40
поделиться

В дополнение к сообщению Jon. создание универсального метода (шаблон) инвертирует требование для этого вида функциональности (использующий <? >). Можно всегда подавать тип в универсальный класс/функцию и для случаев, где Вы не знаете то, что вводит Вас, будет нуждаться в Вас, может сделать незаконный метод/класс универсальным, также... в конечном счете пользователь должен обеспечить тип при вызывании такой функции или использовании универсального класса, чтобы код смог скомпилировать... иначе, Вы получите некоторые ошибки компилятора.

0
ответ дан 30 November 2019 в 00:40
поделиться
[

] Я боролся с той же проблемой, когда речь заходила о портировании вещей с Java, где у меня были конструкции типа [

]. [
if (o instanceof Collection<?>) doSoemthing((Collection<?>)o);
] [

] К счастью, оказывается, что родовая Коллекция - это тоже не генерическая Коллекция, и если кому-то нужно обращаться с элементами в ней как с чистыми предметами, то это все равно возможно:[

]. [
if (o is ICollection) DoSomething((ICollection)o);
] [

] Таким образом, так как нас не волнует реальный тип элементов в коллекции, все, что мы получаем здесь - это объекты. Заметка: если в коллекции были примитивные типы (например, int или байт), то автобоксирование может привести к штрафу за выполнение [

].
0
ответ дан 30 November 2019 в 00:40
поделиться
Другие вопросы по тегам:

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