我正在阅读一些代码,并想了解为什么以下内容会起作用:
这是一个堆栈类: public class Stack<Item> { ***** }
然后在 main 方法中创建了一个类的实例:
Stack<String> s = new Stack<String>();
Generic Stack 类声明中的具体含义是什么Item
?它是标准的 JavaItem
类,还是 Java 泛型的命名约定?我认为这String
需要成为它的子类Item
才能使代码正常工作,对吗?
在
public class Stack<Item>
Item
是一个正式的类型参数名称。它不对应于任何特定的 java 类,因此它没有隐含的包名称。
在
Stack<MyItem> stack = new Stack<MyItem>();
MyItem
是 type 的实际绑定Item
,因此必须对应于实际类并具有隐式包。
“正式”和“实际”参数的区别x
与42
下面的区别相同:
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.
Item
似乎不是标准的 Java 类。它可能只是一个任意的泛型类型,在这种情况下,String
可以毫无问题地使用特定类型。
你指的是 Stack 类的这个实现吗?
http://algs4.cs.princeton.edu/13stacks/Stack.java.html
我认为 String 需要成为这个 Item 的子类才能使代码工作,对吧?
不必要。浏览上面评论中给出的 Java 跟踪。可以定义泛型,以便您可以“插入”一个类并使用泛型类型在整个类或方法中引用它。
PS:请注意,泛型仅在编译时强制执行。它们不存在于字节码中。