gpt4 book ai didi

java - 类型参数的遮蔽

转载 作者:行者123 更新时间:2023-12-02 00:56:40 25 4
gpt4 key购买 nike

我在解决问题时遇到了一个关于类型参数的非常基本的问题。

我有一个带有字符串数组的类,我正在使用自定义比较器类对其进行排序。下面是我的比较器类

class SortComparator implements Comparator<String>
{

@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2);
}

}

上面的类运行良好并输出所需的结果。

如果类名从 SortComparator 更改至SortComparator<String>需要更改比较方法。更改后的类如下所示

class SortComparator<String> implements Comparator<String>
{

@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
return ((java.lang.String) o1).compareTo((java.lang.String) o2);
}

}

上面的类也运行良好并输出所需的结果

为什么需要显式转换 String对象 o1o2java.lang.String当它们已经是同一类的对象时?

我在网上搜索了我的这个查询一段时间,发现了一个非常相似的问题

Comparing two Integers with my own Comparator

这个问题的答案说是因为shadowing

我知道局部变量、实例变量和类变量方面的隐藏,但在这种情况下它是如何工作的?

最佳答案

问题出在名为String的泛型类型上。这是泛型类型参数和实际类 String 之间的冲突。

由于类型参数 String无界,Java 编译器将其替换为 Object,因此方法 compare 的参数> 作为 Object 工作,并且对象类没有 compareTo 方法,因此您必须进行强制转换。

尝试下面的示例,效果很好。

class SortComparator<T> implements Comparator<String>
{

@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2);
}

}

请查看 Erasure of Generic Types 上的 Java 文档

During the type erasure process, the Java compiler erases all type parameters and replaces each with its first bound if the type parameter is bounded, or Object if the type parameter is unbounded.

为了更加清晰,下面的示例直接从上面的 Java 文档复制。

考虑以下表示单链表中的节点的泛型类:

public class Node<T> {

private T data;
private Node<T> next;

public Node(T data, Node<T> next) }
this.data = data;
this.next = next;
}

public T getData() { return data; }
// ...
}

由于类型参数T是无界的,Java编译器将其替换为Object:

public class Node {

private Object data;
private Node next;

public Node(Object data, Node next) {
this.data = data;
this.next = next;
}

public Object getData() { return data; }
// ...
}

关于java - 类型参数的遮蔽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37386592/

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