列表包含不安全的方法

Gau*_*rav 15 java generics

虽然经历了这个问题:" 如果一个对象包含一个链表内检查 ",我发现用户正试图通过一个字符串参数到包含类型链表的链表的方法:

    LinkedList<LinkedList> list = new LinkedList<LinkedList>();

    list.contains("String");
Run Code Online (Sandbox Code Playgroud)

这不会引发任何编译错误,因为'contains'方法接受java.lang.Object并允许向其传递字符串值.

所以,只是出于好奇,我想知道为什么这种方法选择接受"对象",当它可能已被限制为仅接受列表类型(就像添加).是不是打败了泛型的整个目的,即"在编译时更强的类型检查"?

NPE*_*NPE 8

假设你有一个BankAccount被识别的AccountId(两个都是类,不扩展另一个).

现在让我们说你有LinkedList<BankAccount> accounts;并想看看是否有一个具有给定ID的帐户.

现在,AccountId.equals()可以接受BankAccount并与帐户的ID进行比较.有了这个,你就可以调用accounts.contains(account_id)它,即使参数contains()的类型与集合的类型完全无关,它也会正常工作.

  • 我认为以一种类的一个实例可以与另一个类的实例"等于"的方式实现两个不同的类是非常不可靠的**.许多合理的使用模式可能会破坏这种实现.(这是指在它们实现的通用接口方面不"相等"的类) (9认同)

Mic*_*use -1

只是为了向后兼容。尽管泛型对于将集合的内容限制为同类类型很有用,但如果您选择的话,让集合包含异构对象仍然是一个有效的用例。

public static void main(String[] args)
{
    List<String> homogeneousStringList = new ArrayList<String>();

    homogeneousStringList.add("Foo");
    homogeneousStringList.add("Bar");

    List heterogeneousObjectList = new ArrayList();

    heterogeneousObjectList.add("Foo");
    heterogeneousObjectList.add(Integer.valueOf(1));
    heterogeneousObjectList.add(new Date());

    System.out.println(homogeneousStringList.toString());
    System.out.println(heterogeneousObjectList.toString());
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

[富,酒吧]

[Foo,1,2014 年 MDT 9 月 21 日星期日 00:36:59]