gpt4 book ai didi

java - 不同Java类型删除和泛型类型格式的优势

转载 作者:行者123 更新时间:2023-11-30 10:15:45 25 4
gpt4 key购买 nike

我正在用 Java 实现一个使用泛型的库。据我了解,泛型是后来在Java中引入的,目的是提供类似于C++中模板的特性,同时也保持向后兼容性。也就是说,参数化类型 AVLTree<K, V>在运行时简单地显示为 AVLTree ,因此得名“类型删除”。

我发现以下三种编写类定义的方法是等效的,因为编译器不会报错,我也不会遇到任何与类型相关的奇怪运行时问题。我没有使用反射,所以我没有看到这方面的好处。

我被告知不要使用这个:

AVLTree<K extends Comparable<K>, V>

相反,他们说,使用这个:

AVLTree<K extends Object & Comparable<? super K>, V>

但是,以下也可以:

AVLTree<K extends Comparable<? super K>, V>

我读过,如果你能避免使用 SomeClass<E>你应该,更新的 Java 正在使用这种语法 <?>.有人可以澄清这对我的代码的区别和影响吗?如果我不一致,我是否可能会引入错误?

最佳答案

好吧,他们应该就他们的决定进行辩论(或者邀请他们来这里,这总是一个不错的选择)。严格来说,它们确实有道理,但没有那么多。

声明AVLTree<K extends Comparable<? super K>, V>意味着您可以通过 parent 比较 child (通过 ? super K )。例如? extends CharSequence ,你可以比较任何 CharSequence ,不只是 String例如。这些是the famous PECS下的标准声明.

老实说,我很少需要这样做(可能是我没有太频繁地公开我的 API),所以我通常这样做:

K extends Comparable<K>

这样你就不会引入任何错误,你只会限制可以调用的 api,显然如果你关心这个。

另一方面<?>不是新的或旧的语法,它只是说任何类型,你很少需要那个 IMO。声明这样一个 List<?>例如,将其设置为只读,您将从中获取的对象是 Object只是,这只是 ? extends Object 的简化版本.

关于java - 不同Java类型删除和泛型类型格式的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50357399/

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