java – 列表与列表
发布时间:2020-12-14 05:09:24 所属栏目:Java 来源:网络整理
导读:为什么在使用List时丢失类型安全性,而在使用List Object?他们不是基本一样吗? 编辑:我发现以下是编译错误 public class TestClass{ static void func(ListObject o,Object s){ o.add(s); } public static void main(String[] args){ func(new ArrayListSt
为什么在使用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)); } } 为什么? 解决方法
不,他们不是一回事. 如果您提供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的值,并将该值添加到列表中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |