我已经坚持这个问题几个小时了。我正在尝试为C#找到一个等效的方法。
Java ,有效:
public class Main
{
public static void main(String[] args)
{
ArrayList<BaseList<? extends Base>> list = new ArrayList<>();
list.add(new DerivedList());
}
}
public class BaseList<T extends Base>
{
}
public class Base
{
}
public class DerivedList extends BaseList<Derived>
{
}
public class Derived extends Base
{
}
我需要在C#中使用ArrayList<BaseList<? extends Base>>
的等效方法。我希望有人帮助我。
在C#中是否可以将变量通配符?
答案 0 :(得分:1)
C#使用运行时类型实现,而Java使用类型擦除。这意味着在Java中,case WM_KILLFOCUS:
{
//tried below all options
::BringWindowToTop(hWnd):
::SetForegroundWindow(hWnd);
::SetFocus(hWnd);
::SetActiveWindow(hWnd);
}
在运行时与ArrayList<Foo>
是同一个类。这是不是在C#中的情况,所以你不能像这样丢弃类型参数。
您可以尝试解决这个问题:
ArrayList<Bar>
然后使用public abstract class BaseList
{
}
public class BaseList<T> : BaseList
where T : Base
{
}
答案 1 :(得分:1)
你不能完全按照你的描述那样做,但有一些解决方法。一个在另一个答案中提到,另一个是使用接口代替:
public class Main
{
public static void main(String[] args)
{
var list = new List<IBaseList<Base>>();
list.Add(new DerivedList());
}
}
// note "out" here
public interface IBaseList<out T> where T : Base {
}
public class BaseList<T> : IBaseList<T> where T : Base {
}
public class Base {
}
public class DerivedList : IBaseList<Derived> {
}
public class Derived : Base {
}