Java泛型类型通配符和C#泛型中的通配符有些许不同之处。本文将深入讨论这些不同点,并带来一些示例来加深读者的理解。
1. Java泛型类型通配符
Java泛型类型通配符表示某个范围内的类型参数,但具体是哪个类型参数是未知的。泛型类型通配符用?
表示,它可以用来定义泛型方法、泛型类和泛型接口,让代码在编译期间进行类型检查,减少运行时的错误。
1.1 无限制通配符
无限制通配符表示可以匹配任意类型。
public void printList(List<?> list) {
for (Object obj : list) {
System.out.print(obj + " ");
}
}
1.2 上界通配符
上界通配符表示要匹配的类型必须是某个类或接口的子类或实现类。
public void addToList(List<? extends Number> list, Number num) {
list.add(num);
}
1.3 下界通配符
下界通配符表示要匹配的类型必须是某个类或接口的父类或超类。
public void addToList(List<? super Integer> list, Integer num) {
list.add(num);
}
2. C#泛型中的通配符
C#泛型中的通配符叫做类型参数约束。它是用 where
关键字来定义的。
2.1 类型参数约束
类型参数约束表示要匹配的类型必须是某个类或接口的子类或实现类。
public void addToList<T>(List<T> list, T num) where T : Number {
list.add(num);
}
2.2 结构体约束
结构体约束表示要匹配的类型必须是值类型。
public void printList<T>(List<T> list) where T : struct {
foreach (var item in list) {
Console.Write(item + " ");
}
}
3. 示例
3.1 Java 泛型类型通配符示例
public class Test {
public static void main(String[] args) {
List<Integer> integerList = new ArrayList<>();
integerList.add(1);
integerList.add(2);
integerList.add(3);
printList(integerList);
List<Double> doubleList = new ArrayList<>();
doubleList.add(1.1);
doubleList.add(2.2);
doubleList.add(3.3);
printList(doubleList);
}
public static void printList(List<?> list) {
for (Object obj : list) {
System.out.print(obj + " ");
}
System.out.println();
}
}
输出:
1 2 3
1.1 2.2 3.3
3.2 C#泛型类型参数约束示例
public class Test {
public static void Main(string[] args) {
List<double> doubleList = new List<double>();
doubleList.Add(1.1);
doubleList.Add(2.2);
doubleList.Add(3.3);
printList(doubleList);
List<int> intList = new List<int>();
intList.Add(1);
intList.Add(2);
intList.Add(3);
printList(intList);
}
public static void printList<T>(List<T> list) where T : struct {
foreach (var item in list) {
Console.Write(item + " ");
}
Console.WriteLine();
}
}
输出:
1.1 2.2 3.3
1 2 3
通过上述示例,我们可以看出 Java 和 C# 泛型类型通配符以及泛型类型参数约束的不同之处。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java泛型类型通配符和C#对比分析 - Python技术站