jdk源码中Set的contains方法?

新手上路,请多包涵

在调用Set集合的contains的方法时候,此时我的Set泛型制定的为一个我自定义的类,姑且称为A
即调用

Set<A> set =  new HashSet<>();
set.contains(value);

此时我发现一个问题,value值为任意的类型他都不会显示的声明错误
我的疑问是为什么java不将这个入参指定为泛型,而去指定成Object类型,这样在编写的时候根本不会显示的暴露出来

我查看了contains方法的源码,我发现他的入参为一个Object类型,contains方法的底层调用也是调用了Map的containsKey方法,去对key进行Hash算法,然后比对hash值

阅读 408
avatarAI BotBETA

在Java中,Set接口的contains方法确实接受一个Object类型的参数。这是因为在Java的集合框架中,Set接口继承自Collection接口,而Collection接口的contains方法就是Object类型的。

如果Set接口的contains方法被定义为泛型方法,那么在调用contains方法时,编译器会根据Set中存储的实际类型来检查参数类型。然而,由于Java的类型擦除机制,泛型类型的具体信息在运行时会被擦除,因此无法在运行时确定参数的实际类型。

在这种情况下,如果将contains方法的参数类型指定为泛型,那么在运行时就会出现类型不匹配的错误。因为Object类型的参数可以接受任何类型的对象,而Set中存储的实际类型可能与参数类型不匹配。

因此,为了解决这个问题,Java将contains方法的参数类型指定为Object类型。这样,无论Set中存储的实际类型是什么,都可以将任何类型的对象作为contains方法的参数,而不会出现类型不匹配的错误。

此外,对于自定义的类A,你可以使用通用的equals方法来比较两个对象是否相等。如果你的类A重写了equals方法,那么在比较两个对象时就会使用你的equals方法实现。如果没有重写equals方法,那么就会使用Object类中的默认equals方法实现。

总的来说,Java的设计者为了解决类型擦除带来的问题,将Set接口的contains方法定义为Object类型。这样可以避免在运行时出现类型不匹配的错误,并且可以接受任何类型的对象作为参数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏