C# 泛型中的 Java 通配符相当于什么

2024-05-06

我正在开发一个应用程序,我需要调用泛型类的方法,并且我不关心实例的实际类型。类似下面的 Java 代码:

public class Item<T>{
  private T item;

  public doSomething(){...}
}

...
public void processItems(Item<?>[] items){
 for(Item<?> item : items)
   item.doSomething();
}

当时我很着急,所以我通过定义一个带有我需要调用的方法的接口并让泛型类实现它来解决我的问题。

public interface IItem  
{
   void doSomething();
}

public class Item<T> : IItem {
  private T item;

  public void doSomething(){...}
}

...
public void processItems(IItem[] items)
{
 foreach(IItem item in items)
   item.doSomething();
}

此解决方法工作正常,但我想知道实现相同行为的正确方法是什么。

EDIT:

我忘了提及呼叫者processItems不知道实际类型。实际上,这个想法是将数组作为参数传递给processItems可以包含混合类型。由于 .Net 中不可能有这样的数组,因此使用非通用基类或接口似乎是唯一的方法。


执行此操作的正常方法是使该方法通用:

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

假设caller知道类型,类型推断应该意味着他们不必显式指定它。例如:

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

话虽如此,创建指定与类型无关的操作的非通用接口也很有用。这在很大程度上取决于您的具体用例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 泛型中的 Java 通配符相当于什么 的相关文章

随机推荐