gpt4 book ai didi

Java 最佳实践——返回对象与泛型

转载 作者:搜寻专家 更新时间:2023-11-01 01:43:34 24 4
gpt4 key购买 nike

我第一次在学校项目中使用泛型,我遇到了关于是返回对象还是在我的方法中声明的泛型元素的哲学困境。

我的强制症告诉我,我需要始终返回已知类型,但我发现这样做会在我将原始数据类型输入我的类时产生一些下游烦恼(当然,对于这个项目,我只是曾经将原语输入此类)。

这是我的意思的一个例子:

public class DansPriorityQueue<E extends Comparable> 
{
private ArrayList<E> tree;

//Here's a method that returns an object
public Object peek() {
return tree.get(0);
}

//Here's a method that returns the generic type
public E peek() {
return tree.get(0);
}

(仅供引用。我需要自己实现这个 JDK 类,但幸运的是不需要实现与真正的 PriorityQueue 相同的接口(interface),所以我可以选择我是想使用对象还是泛型)

我的问题

这让我觉得有点脏,但我很想在这些方法上返回一个对象而不是我的 E 泛型元素,因为当我返回 E 时,JUnit 强制我转换我的整数值:

DansPriorityQueue<Integer> dpq = new DansPriorityQueue<Integer>();
dpq.add(1);
assertEquals("Expected different value", (Integer) 1, dpq.peek());

另一方面,当我返回一个对象时,自动装箱不会强制我转换原始值。

这是对我一直面临的问题的更 Eloquent 描述:

http://www.aschroder.com/2009/10/php-1-java-0-the-method-assertequalsobject-object-is-ambiguous-for-the-type/

------------编辑----------------

这是我在返回泛型类型并使用自动装箱的 Integer 对象填充我的列表时收到的实际错误,没有上面的转换:方法 assertEquals(String, Object, Object) 对于 DansPriorityQueueTest 类型是不明确的

--------结束编辑----------------

问题

  1. 谁能告诉我为什么我应该或不应该返回一个对象而不是我正在使用的通用元素?两者似乎各有利弊……最佳做法是什么?

  2. 我隐约知道返回一个 Object 可能会在以后导致一些转换问题,但我还没有遇到过这些问题......有没有人有具体的例子说明这有多危险?

  3. 在 JDK 中,我注意到许多 Collections 方法默认返回 Object。这是因为泛型是在更高版本的 Java 中引入的,还是 Sun Systems 有意做出的决定?

最佳答案

Can anyone tell me why I should or should not return an object as opposed to the generic element I'm working with? Both seem to have upsides and downsides... what's the best practice?

这取决于。在这种情况下,您需要泛型类型——否则为类定义泛型类型有什么意义呢?

I know vaguely that returning an Object can cause some casting issues later on but I've not yet run into them... does anyone have a specific example of how this can be dangerous?

当然!

DansPriorityQueue<String> queue = new DansPriorityQueue<String>();
//add items
Float f = (Float)queue.getObject(); //uh-oh! this compiles but will fail
Float f = queue.getObject(); //generic type, fails during compile

In the JDK, I've noticed that many of the Collections methods return Object by default. Is this because Generics was introduced in a later version of Java or was this a conscious decision by Sun Systems?

这主要是由于向后兼容性,或者在您真正要使用集合来包含不同值的情况下(例如,JLabel、字符串和图标的混杂,用于呈现 JTable)。

assertEquals("Expected different size", (Integer) 2, dpq.size());

我不认为这应该是一个问题。 dpq.size() 应该只返回一个 int,而不管优先级队列中存储了什么。它不会是通用值。

你可以创建类似的东西

DansPriorityQueue<Double> queue = new DansPriorityQueue<Double>();
for(double d = 0; d < 10; d+=1.0)
queue.add(d);

这应该不会造成任何问题,对吧?

关于Java 最佳实践——返回对象与泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19863006/

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