为什么在使用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 usingList<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的值,并将该值添加到列表中.
原文地址:https://www.jb51.cc/java/123351.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。