我有泛型类的基本结构
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#中知道的所有类型参数。
我对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…