您的问题,
C# 中是否有 Java 中以下代码的等价物
List<? extends Number> list;
list = new ArrayList<Float>();
list = new ArrayList<Integer>();
list.add(Float.valueOf("4.0")); // doesn't compile and it is fine
Number e = list.get(0); // workds
不,直接没有等效项,因为“数字”没有基类或超类或接口,但有一个等效项(类似于“?”运算符),即 where 关键字。
您可以在有关它的msdn 页面上获得有关它的更多信息。
您可以对类中的变量执行此内联操作,如下所示:
public class ArrayList<T> where T: someBaseClass
{
List<T> list = new List<DerivedTypeOfSomeBaseClass>();
}
或在函数内部
public T getArrayList<T>(ArrayList<T> arr) where T: someBaseClass
List<T> list = new List<DerivedTypeOfSomeBaseClass>()
你的问题
现在,在C#的另一边,看起来我需要找到一个支持协方差的接口然后使用它。所以,每当我想编写一些泛型类时,我必须编写一个单独的接口来支持所有派生类的所有协变操作,并确保我的类实现该接口?这是正确的还是我错过了什么
协变和逆变的一般概念指出,协变是使用比泛型参数指定的更多派生类型的能力,而逆变是使用派生较少类型的能力。
有关协变和逆变的详细说明,您可以阅读MSDN 链接。
所以,如果你想通过通用方式做这件事,你是对的,你必须有一个支持所有协变操作的通用基础接口。
在您针对数字的特定情况下,C# 中的所有 Byte、Double、Float、Integer、Long、Short 都实现了 IComparable、IFormattable、IConvertible、IComparable、IEquatable 接口,所以对于您的第一个问题,
public class Program<K> where K : IComparable, IFormattable, IConvertible, IComparable<K>, IEquatable<K>
{
static void Main()
{
Program<int> pro = new Program<int>();
Program<Byte> bpro = new Program<Byte>();
Program<Double> dpro = new Program<Double>();
Program<Int64> fpro = new Program<Int64>();
Program<long> lpro = new Program<long>();
Program<short> spro = new Program<short>();
}