gpt4 book ai didi

java - 在Java中,相同类型但不同类型参数的空集合总是相等吗?

转载 作者:行者123 更新时间:2023-11-29 04:23:25 25 4
gpt4 key购买 nike

考虑以下代码片段:

    List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
assertThat(list1.equals(list2), is(true));

断言成功。

事实上,据我所知,由于运行时类型删除(即类型参数的事实),Java 中的 equals 方法无法区分两者。 StringInteger 只能在编译时访问,而不能在运行时访问)。由于没有可以比较的元素, equals 必须返回 true。按照这个思路,对于所有集合来说,这一定是正确的。

所以问题如下:我的思维过程是正确的,还是我遗漏了什么?

编辑

@qqilihq 给出了出色的 answer ,这会提示下一个问题:这是否可以在不传递显式类型的情况下实现(如果类型以某种方式显式存储,我很好,只是用户不必传递它。)

我尝试了以下操作,但没有成功(我猜是由于类型删除):

    public TypedList(List<T> delegate) {
this.delegate = Objects.requireNonNull(delegate);
this.type = (Class<T>) delegate.getClass();
}

但是也许你可以做类似的事情? this.type = T。 (这不会编译,但也许类似的事情是可能的。)

最佳答案

正如您所说,在给定示例中,类型信息在运行时丢失。但关于您在评论中提出的问题:

can you also show a counter-example, i.e. a collection where two empty instances of different generic types would not be treated as equal?

您当然可以实现自己的Collection,它确实会考虑equals方法中的类型信息。这是一个围绕任意 List 创建 TypedList 包装器的非常简单的示例:

static final class TypedList<T> extends AbstractList<T> {
private final List<T> delegate;
private final Class<T> type;

public TypedList(List<T> delegate, Class<T> type) {
this.delegate = Objects.requireNonNull(delegate);
this.type = Objects.requireNonNull(type);
}

@Override
public T get(int index) {
return delegate.get(index);
}

@Override
public int size() {
return delegate.size();
}

@Override
public boolean equals(Object obj) {
if (!super.equals(obj)) {
return false;
}
// Lists are equal, now additionally, check the type
TypedList<?> other = (TypedList<?>) obj;
return this.type.equals(other.type);
}

// hashCode omitted for brevity
}

请注意,由于提到的类型删除,您需要显式存储类型。用法:

List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
System.out.println(list1.equals(list2)); // true

list1 = new TypedList<>(list1, String.class);
list2 = new TypedList<>(list2, Integer.class);
System.out.println(list1.equals(list2)); // false

关于java - 在Java中,相同类型但不同类型参数的空集合总是相等吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47727217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com