当前位置: 首页 > 面试题库 >

为通用集合编写contains()

宦文柏
2023-03-14
问题内容

我正在练习中用Java写一个skiplist类。我编写了一个名为的类SkipListInternal<E>,其中包含实际的跳过列表。我还制作了一个包装类SkipListSet<E>,该包装类实现了SortedSet<E>接口并包含的实例SkipListInternal<E>

其中,SkipListInternal<E>包含一个方法E find(E e),该方法返回等于e存在的元素,否则返回null。

在编写boolean contains(Object o)(继承自Collection<E>via
SortedSet<E>)方法时,我注意到其参数是一个Object而不是一个E。我打算这样做,但由于类型擦除而无法实现:

public class SkipListSet<E> implements SortedSet<E>{
   private SkipListInternal<E> skiplist;

   ...

   public boolean contains(Object o){
       if (!(o instanceof E)) return false;
       return skiplist.find((E) o) != null;
   }

   ...

}

由于无法通过这种方式完成操作,该怎么办?


问题答案:

严格来说,这样的实现是错误的。

这样做的原因是,即使对象不是type E,它仍然可以trueequals()调用时返回。

假设有一秒钟,您有一个这样的类:

public class FakeString {
  private final String value;

  public FakeString(String value) {
    if (value == null) {
      throw new IllegalArgumentException();
    }
    this.value = value;
  }

  public int hashCode() {
    return value.hashCode();
  }

  public boolean equals(Object o) {
    return value.equals(o);
  }
}

然后此代码将打印true

List<String> strings = Arrays.asList("foo", "bar", "baz");
System.out.println(strings.contains(new FakeString("bar")));

只是要澄清一下:此行为是 有意的, 并且是contains()采用a
Object代替的原因Eremove()顺便说一句,对于,也是如此。



 类似资料:
  • 问题内容: 我要实现以下功能: 如何检查向量元素类型? 请注意, 向量可能为空,因此我无法检查第一个元素是“ instanceof”整数还是String … 编辑: 好吧,我脑子里有个念头,我不知道它是否会起作用 我可以按以下方式实现checkType函数: 是否可以检查T是否为整数?! 提前致谢 问题答案: *由于 类型擦除, *泛型类型参数 在运行时不可恢复(某些特殊情况除外)。这意味着在运行

  • 在进一步介绍之前,让我们花点时间来讨论编写"通用"代码时的约束条件 - 即运行在服务器和客户端的代码。由于用例和平台 API 的差异,当运行在不同环境中时,我们的代码将不会完全相同。所以这里我们将会阐述你需要理解的关键事项。 服务器上的数据响应 在纯客户端应用程序 (client-only app) 中,每个用户会在他们各自的浏览器中使用新的应用程序实例。对于服务器端渲染,我们也希望如此:每个请求

  • 我如何才能编写一个排序方法,它将与实现的任何类的一起工作?我查看了的源代码,它的方法签名中有一些语法我不理解。 下面是我对如何编写方法的最佳(可悲的)猜测,该方法不对进行排序,但有正确的方法头来进行排序。我将使用调用它,其中是实现的类的的任何类的实例(假设之前导入了,请参阅更多信息)。 此外,我想添加一个方法,它为添加一个参数,我只需要知道形参是什么。我想,一旦我知道如何编写常规的时,我就能搞清楚

  • 我们要讲到的第一个类型是 ,也被称为 vector。vector 允许我们在一个单独的数据结构中储存多于一个的值,它在内存中彼此相邻地排列所有的值。vector 只能储存相同类型的值。它们在拥有一系列项的场景下非常实用,例如文件中的文本行或是购物车中商品的价格。 为了创建一个新的空 vector,可以调用 Vec::new 函数,如示例 8-1 所示: 示例 8-1:新建一个空的 vector 来

  • 在进一步介绍之前,让我们花点时间来讨论编写"通用"代码时的约束条件 - 即运行在服务器和客户端的代码。由于用例和平台 API 的差异,当运行在不同环境中时,我们的代码将不会完全相同。所以这里我们将会阐述你需要理解的关键事项。 服务器上的数据响应 在纯客户端应用程序(client-only app)中,每个用户会在他们各自的浏览器中使用新的应用程序实例。对于服务器端渲染,我们也希望如此:每个请求应该

  • 在我的项目(spring boot应用程序)中,我有大约200个测试用例。最近,我们为缓存管理器(ehcache)实现了一个工厂bean,它位于我的启动类(@SpringBootApplication)中。 我的问题是,一旦带有工厂bean的启动类被一个测试用例执行,所有后续的测试用例都会失败,并出现错误。。。 “同一个VM中已存在另一个同名“appCacheManager”的CacheManag