提问人:akbiggs 提问时间:12/27/2010 更新时间:12/27/2010 访问量:670
如何在不知道返回的对象类型的情况下实现在 Java 中返回的方法?
How do I implement a method that returns in Java without knowing what object type I'm returning?
问:
在使用 Python 一年后,我又回到了 Java,所以我试图记住其中的一些语法/设计技术。在这样做的过程中,我将返回并实现我上一堂课中的每个项目,仅在 Java 中......然而,我已经坚持实现一个简单的堆栈。这是因为当我不知道要返回哪种对象时,即在 pop() 方法中,我不确定如何编写方法签名。同样的问题也适用于insert()方法,因为我不知道作为参数传入的对象类型。在 Python 中,没有必要在方法签名中显式声明对象类型,所以这让我感到困惑。
我是否必须为每种可能的参数/返回值类型编写单独的方法,或者是否有办法解决这个问题?
答:
2赞
EboMike
12/27/2010
#1
public Object pop();
.
Object 是每个类继承自的基类。
也就是说,虽然这种签名有其优点,但在许多情况下,更好的方法是类型更安全的方法,即 popInt()、popString() 等 - 毕竟,调用代码需要将 Object 强制转换为某些东西,更糟糕的是,它需要根据通常最好使用多态性完成的事情来决定将其转换为什么。
我不知道你的设置,所以可能只是你的票。Object pop()
编辑:或者使用泛型,就像duffymo专业演示的那样。
评论
1赞
msw
12/27/2010
只要您只需要返回值的 Object 语义(这通常是不够的),这就可以了。泛型是 Java 的解决方案,它们和C++模板一样丑陋: en.wikipedia.org/wiki/Generics_in_Java
6赞
duffymo
12/27/2010
#2
你可以这样写:
public interface Stack
{
void push(Object o);
Object pop();
}
或者,您可以使用泛型:
public interface Stack<T>
{
void push(T o);
T pop();
}
如果你的目的不是编写自己的,你可以使用 Java 内置的那个:
http://www.docjar.com/docs/api/java/util/Stack.html
1赞
Aravind Yarram
12/27/2010
#3
Java 支持泛型,并允许您参数化要存储的类型。所以在你的情况下,它会是这样的。在此处阅读有关此内容的更多信息
public class Stack<T>
{
List<T> items=new ArrayList<T>();
public T push(T item) {...}
public T pop() {...}
}
评论
0赞
duffymo
12/27/2010
不能以您声明的方式使用该 E 项类型。这是不正确的。
0赞
duffymo
12/27/2010
推送返回是什么?我认为这应该是无效的。我看到javadocs有这个签名,但它所做的一切都返回了参数。我看不出有什么意义。
0赞
EboMike
12/27/2010
一些 API 具有返回输入参数以进行链接的函数(即 push(object).foo()),但我认为在推送函数中不需要这样做。
评论