欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java泛型类型通配符和C#对比分析

程序员文章站 2024-03-12 20:49:26
c#的泛型没有类型通配符,原因是.net的泛型是clr支持的泛型,而java的jvm并不支持泛型,只是语法糖,在编译器编译的时候都转换成object类型 类型通配符在...

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>  
{}  

以上就是小编为大家带来的java泛型类型通配符和c#对比分析全部内容了,希望大家多多支持~