初学Java,泛型类型通配符(三十七)

本文探讨了C#和Java中泛型的不同实现方式,包括类型通配符的使用及泛型约束的区别。详细解释了如何在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>
{}


Java 中约束泛型通配符下限:

<? super Type> 这个通配符表示它必须是Type本身,或Type的父类

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值