A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 希望的曙光 中级黑马   /  2013-1-2 15:52  /  2135 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 希望的曙光 于 2013-1-3 02:33 编辑

我有个问题:如果对一个自定义的泛型如MyType,其中有个方法public List<String> getList(),如果在声明其对象为MyType mt;则List<Number> lilst = mt.getList()不会有错,但是如果声明为MyType<Number> mt;则前面的赋值就会出错,我知道有个raw type会做擦除
结果为什么是这样
public Class MType<T>{
  public List<String> getList(){
    return null;
  }
  public static void main(String args[]){
     MType<Number> ty= new MType();
     List<Number> l = ty.getList();//这样编译会报错
     
     MType ty2= new MType();
     List<Number> l = ty2.getList();//这样编译不会错
  }
}
我感觉两个都不应该报错的,但是为什么会有差别?按说编译器都会在编译的时候将类型擦除掉啊。为什么编译的时候两个是有差别的?

5 个回复

倒序浏览
你明明定义了 Class MType<T> 这个是任意泛型
MType<Number> ty= new MType();
List<Number> l = ty.getList();//这样编译会报错
这样写等于是引用你创建类对象的泛型啊。而List 又没指定这样的泛型。
Type mismatch: cannot convert from List<String> to List<Number>
List类这时候是没指定泛型类型的。所以不能转化为List<Number>
MType ty2= new MType();
List<Number> l = ty2.getList();//这样编译不会错‘
Type safety: The expression of type List needs unchecked conversion to conform to List<Number>
这样写就是没有引用MType的泛型,而List<Number>是未知泛型。所以系统报警告。
回复 使用道具 举报
规则和限制  
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。   
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。   
3、泛型的类型参数可以有多个。   
4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上称为“有界类型​”。   
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName("java.lang.String");   泛型还有接口、方法等等,内容很多,需要花费一番功夫才能理解掌握并熟练应用。在此给出我曾经了解泛型时候写出的两个例子(根据看的印象写的),实现同样的功能,一个使用了泛型,一个没有使用,通过对比,可以很快学会泛型的应用,学会这个基本上学会了泛型70%的内容。   
回复 使用道具 举报

MType.java:8: 不兼容的类型
找到: java.util.List<java.lang.String>
需要: java.util.List<java.lang.Number>
     List<Number> l = ty.getList();//这样编译会报错

你好,通过错误提示很明显可以看出你的getList方法返回的是String类型的列表而你要用Number类型的列表来接受,所以会报错。
回复 使用道具 举报
差异就在这两句话:
MType<Number> ty= new MType();  //这个指定了泛型
MType ty2= new MType();    // 这个没指定泛型

getList()返回的是String类型的列表,如果指定的泛型不一致,就会报错
回复 使用道具 举报
学习了,现在了解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马