java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
下面小编就为大家带来一篇 Java 泛型类型通配符和 C# 对比分析小编觉得挺不错的, 现在就分享给大家, 也给大家做个参考一起跟随小编过来看看吧
c# 的泛型没有类型通配符, 原因是. net 的泛型是 CLR 支持的泛型, 而 Java 的 JVM 并不支持泛型, 只是语法糖, 在编译器编译的时候都转换成 object 类型
类型通配符在 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>
- {}
来源: http://www.phperz.com/article/18/0219/359665.html