Java,泛型类型通配符和C#对照
2017-06-03 14:35
232 查看
c#的泛型没有类型通配符,原因是.net的泛型是CLR支持的泛型,而Java的JVM并不支持泛型,仅仅是语法糖,在编译器编译的时候都转换成object类型
类型通配符在java中表示的是泛型类型的父类
编译上面的程序,test(strList) 处将发生编译错误,意味着不能把List<String> 当成List<Object> 的子类. 这时候就须要使用类型通配符了,通配符是一个?号
上面的List<Object>换成List<?>就能够通过编译了
List<String> 能够作为 List<?> 的子类来使用, List<?> 则可作为不论什么List 类型的父类使用,
假设仅仅想作为List<String>的父类,而不是List<int>呢,? 写成这样 List<?
extends String>
在C#中约束泛弄类型是这样
Java 中约束泛型通配符上限:
类型通配符在java中表示的是泛型类型的父类
public void test(List<Object> c) { for(int i = 0;i < c.size();i++) { System.out.println(c.get(i)); } }
//创建一个List<String>对象 List<String> strList = new ArrayList<String>(); //将strList作为參数来调用前面的test方法 test(strList);
编译上面的程序,test(strList) 处将发生编译错误,意味着不能把List<String> 当成List<Object> 的子类. 这时候就须要使用类型通配符了,通配符是一个?号
上面的List<Object>换成List<?>就能够通过编译了
public void test(List<?> c) { for(int i = 0;i < c.size();i++) { System.out.println(c.get(i)); } }
List<String> 能够作为 List<?> 的子类来使用, List<?> 则可作为不论什么List 类型的父类使用,
假设仅仅想作为List<String>的父类,而不是List<int>呢,? 写成这样 List<?
extends String>
在C#中约束泛弄类型是这样
class MyClass<T, U> where T : class where U : struct {}
interface IMyInterface { } class Dictionary<TKey, TVal> where TKey : IComparable, IEnumerable where TVal : IMyInterface { public void Add(TKey key, TVal val) { } }
Java 中约束泛型通配符上限:
//表明T类型必须是Number类或其子类,并必须实现java.io.Serializable接口 Public class Apple<T extends Number & java.io.Serializable> {}
相关文章推荐
- Java,泛型类型通配符和C#对比
- java中泛型之类型通配符(?)
- Java基础:泛型类型的子类及通配符的使用
- 从头认识java-13.11 对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?
- <转>深入理解 Java 泛型:类型擦除、通配符、运行时参数类型获取
- C#中使用泛型对照使用通用基础类型效率减少近一倍
- java中泛型学习1之类型通配符(?)
- java里程碑之泛型--类型通配符
- Java泛型——类型通配符<?> 与 类型通配符上限<? extends Number>
- Java泛型类型限定和通配符类型限定
- [疯狂Java]泛型:泛型方法、泛型方法VS类型通配符(?)
- 深入理解 Java 泛型:类型擦除、通配符、运行时参数类型获取
- 在 Java 的泛型类型中使用通配符
- Java 泛型类型及其子类以及通配符
- java中泛型之类型通配符(?)
- Java 泛型类型通配符
- 在 Java 的泛型类型中使用通配符
- Java知多少(42)泛型通配符和类型参数的范围
- [疯狂Java]泛型:类型参数多态问题、类型通配符(?)、类型通配符的上下限、类型参数的上限(类、接口)
- Java基础(21):泛型—泛型的定义、用法与类型通配符的使用方式