0

我正在阅读一些代码,并想了解为什么以下内容会起作用:

这是一个堆栈类: public class Stack<Item> { ***** }

然后在 main 方法中创建了一个类的实例: Stack<String> s = new Stack<String>();

Generic Stack 类声明中的具体含义是什么Item?它是标准的 JavaItem类,还是 Java 泛型的命名约定?我认为这String需要成为它的子类Item才能使代码正常工作,对吗?

4

2 回答 2

2

public class Stack<Item>

Item是一个正式的类型参数名称。它不对应于任何特定的 java 类,因此它没有隐含的包名称。

Stack<MyItem> stack = new Stack<MyItem>();

MyItem是 type 的实际绑定Item,因此必须对应于实际类并具有隐式包。

“正式”和“实际”参数的区别x42下面的区别相同:

int f(int x) { ... }   // x is a formal parameter name

System.out.println(f(42));   // 42 is the actual parameter to which the formal x is bound.
于 2013-03-26T03:47:44.520 回答
1

Item似乎不是标准的 Java 类。它可能只是一个任意的泛型类型,在这种情况下,String可以毫无问题地使用特定类型。

你指的是 Stack 类的这个实现吗?

http://algs4.cs.princeton.edu/13stacks/Stack.java.html

我认为 String 需要成为这个 Item 的子类才能使代码工作,对吧?

不必要。浏览上面评论中给出的 Java 跟踪。可以定义泛型,以便您可以“插入”一个类并使用泛型类型在整个类或方法中引用它。

PS:请注意,泛型仅在编译时强制执行。它们不存在于字节码中。

于 2013-03-26T03:48:18.023 回答