C#等效于Java List <?扩展类> - c#

我有泛型类的基本结构

public class Parent<T> where T : Parent<T>
{
   Action<T> Notify;
}

public class Child : Parent<Child>
{
}

我想要一个列表,以便可以将Child对象放在此处

List<Parent> parents = new List<Parent>();

在Java中,我只能编写List<? extends Parent>,并且可以将所有Parent的所有子类轻松添加到列表中。 C#中是否有其他替代方法?

参考方案

您不能与Java做相同的事情,因为在Java中,泛型使用类型擦除和中断方差。本质上,您的Java代码将所有内容转换为List<object>,并希望达到最佳效果。 List<?>优于List<Object>的唯一原因是,并非Java中的所有内容都是Object-在C#中,您可以在List<object>中放入一个整数。请注意,如果可以的话,List<int>的性能将比List<object>好得多-这是将泛型最初添加到C#的主要原因之一。

C#比这更严格。您不能做任何允许使用任何new List<Parent<T>>()的类似Parent<T>的操作。如果您有更多有限的要求,则可以改用接口,但是出于明显的原因,该接口不适用于List<T>

您唯一的实际选择是使基类为非泛型。无论如何,列表用户都无法事先了解T的任何信息,因此Parent界面中返回或使用T的任何部分如果不进行强制转换将无用(Java会为您进行强制转换) ,但仍处于强制转换状态-Java和C#的泛型都没有足够强大的功能来执行您要执行的操作)。

public abstract class Parent
{
  // The common methods
  public abstract int Id { get; }
}

public abstract class Parent<TChild> : Parent, IEnumerable<TChild>
{
  // The methods that are TChild-specific - if you don't need any of those, just drop
  // this class, the non-generic one will work fine
  private List<TChild> children;
  public void Add(TChild child) => ...
  public TChild this[int index] => ...
}

public class Child : Parent<TChild>
{
  ...
}

现在要获取所有可能孩子的列表,您可以使用

var list = new List<Parent>();

而当您需要获取例如所有Child项目,您都可以做

var children = list.OfType<Child>();

仅出于完整性考虑,您可以使用C#的dynamic获得与Java类似的行为。但我什至不打算展示任何示例-dynamic是有用的工具,但主要用于解决更多动态键入问题。这样简单的事情就太过分了,并且将编译时问题换成运行时问题。

通常,如果您曾经直接使用Parent<T>,则应采用通用方法-例如具有对所有Parent<T>通用功能的扩展方法。您无法实例化一个通用类型,该通用类型当时没有在C#中知道的所有类型参数。

List <Dog>是List <Animal>的子类吗?为什么Java泛型不是隐式多态的? - java

我对Java泛型如何处理继承/多态感到困惑。假设以下层次结构-动物(父母)狗-猫(儿童)因此,假设我有一个方法doSomething(List<Animal> animals)。根据继承和多态性的所有规则,我假设List<Dog>是List<Animal>,而List<Cat>是List<Animal&g…

将对象转换为List <object> - c#

我看过类似的问题,但没有什么合适的。我有一个碰巧包含列表的对象。我想把它变成我可以列举的东西。例如:object listObject; // contains a List<Something> List<object> list; list = listObject as List<object>; // list c…

将谓词<T>转换为Func <T,bool> - c#

我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…

合并List <T>和List <Optional <T >> - java

鉴于: List<Integer> integers = new ArrayList<>(Arrays.asList( 10, 12 )); List<Optional<Integer>> optionalIntegers = Arrays.asList( Optional.of(5), Optional.em…

无法从ArrayList <String>转换为List <Comparable> - java

当我写下面的代码时,编译器说 无法从ArrayList<String>转换为List<Comparable>private List<Comparable> get(){ return new ArrayList<String>(); } 但是当我用通配符编写返回类型时,代码会编译。private List&l…