java – 列表与列表

为什么在使用List时丢失类型安全性,而在使用List< Object>?他们不是基本一样吗?

编辑:我发现以下是编译错误

public class TestClass
{
    static void func(List<Object> o,Object s){
        o.add(s);
    }

    public static void main(String[] args){
        func(new ArrayList<String>(),new Integer(1));
    }
}

而这不是

public class TestClass
{
    static void func(List o,new Integer(1));
    }
}

为什么?

解决方法

Why do we lose type safety when using List and not while using List<Object>? Aren’t they basically the same thing?

不,他们不是一回事.

如果您提供API,

class API {
  static List<Object> getList() { ... }
  static void modifyList(List<Object> l) { ... }
}

客户端使用不当

List<Integer> list = API.getList();
API.modifyList(list);
for (Integer i : list) { ... }  // Invalid

那么当你的API指定List< Object>他们得到一个编译时错误,但是当API.getList()返回一个List并且API.modifyList(list)接受一个没有泛型类型参数的List时,它们不会.

编辑:

评论你提到改变

void func(List<Object> s,Object c) { s.add(c); }

void func(List s,Object c) { s.add(c); }

以便

func(new List<String>(),"");

会工作.

那就是违规型安全.这样做的类型安全的方法

<T> void func(List<? super T> s,T c) { s.add(c); }

这基本上是说func是一个参数化函数,它接受一个列表,其类型可以是T的任何超类,并且类型为T的值,并将该值添加到列表中.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...