为什么不需要用通用内部 class 进行参数化?
Why don't need to parameterize with generic inner class?
尝试使用自定义链表编写自定义(但众所周知)堆栈通用实现。但算法不是重点。我的问题是,为什么不需要参数化
class Node<T>
以及声明
Node <T> top; //pointer to next node
会不会多余?为什么?或者可能需要使用另一个字符,例如<U>
?
public class Stack<T> {
//T is the type parameter
Node top; //topmost element of stack
//defines each node of stack
class Node{
T value; //value of each node
Node next; //pointer to next node
public Node(T value){
this.value=value; //initializing
next=null;
}
}
//This function pushes new element
public void push(T value){
Node current=new Node(value);
if(isEmpty())
top=current; //if empty stack
else{
current.next=top;
top=current;
}
}
//This function pops topmost element
public T pop(){
T value=null;
if(!isEmpty()){
top=top.next;
value=top.value;
}
return value; //returning popped value
}
请注意,这里的 Node
class 不是 static
。这意味着 Stack
的每个 实例 都有自己的 Node
class。与任何其他成员一样,它可以访问其封闭的 class' T
.
如果您的节点 class 是它自己的顶级 class(在它自己的 .java 文件中),那么它将需要一个通用参数,因为您希望它具有.我建议你这样做。
但是,因为它是 Stack 的(非静态)内部 class,它可以访问 Stack 实例 中的所有内容,包括所有通用信息。
Will it be redundant?
是的。
Why?
由于 Node
被声明为 Stack
的内部 class,变量 T
在 Node
的范围内,可以使用如所须。
Or may be need to use another character e.g. <U>
?
如果您需要声明一个独特的类型变量,您可以这样做。 (事实上你可能应该使用不同的变量名。)它可能看起来像这样:
public class Stack<T> {
Node<T> top; // CHANGE HERE
class Node<U> { // CHANGE HERE
U value; // CHANGE HERE
Node<U> next; // CHANGE HERE
public Node(U value) { // CHANGE HERE
this.value = value;
next = null;
}
}
public void push(T value) {
Node<T> current = new Node<>(value); // CHANGE HERE
if (isEmpty())
top = current;
else {
current.next = top;
top = current;
}
}
public T pop() {
T value = null;
if (!isEmpty()) {
top = top.next;
value = top.value;
}
return value;
}
这说明添加额外类型变量会产生更多代码,但不会提高可读性。
尝试使用自定义链表编写自定义(但众所周知)堆栈通用实现。但算法不是重点。我的问题是,为什么不需要参数化
class Node<T>
以及声明
Node <T> top; //pointer to next node
会不会多余?为什么?或者可能需要使用另一个字符,例如<U>
?
public class Stack<T> {
//T is the type parameter
Node top; //topmost element of stack
//defines each node of stack
class Node{
T value; //value of each node
Node next; //pointer to next node
public Node(T value){
this.value=value; //initializing
next=null;
}
}
//This function pushes new element
public void push(T value){
Node current=new Node(value);
if(isEmpty())
top=current; //if empty stack
else{
current.next=top;
top=current;
}
}
//This function pops topmost element
public T pop(){
T value=null;
if(!isEmpty()){
top=top.next;
value=top.value;
}
return value; //returning popped value
}
请注意,这里的 Node
class 不是 static
。这意味着 Stack
的每个 实例 都有自己的 Node
class。与任何其他成员一样,它可以访问其封闭的 class' T
.
如果您的节点 class 是它自己的顶级 class(在它自己的 .java 文件中),那么它将需要一个通用参数,因为您希望它具有.我建议你这样做。
但是,因为它是 Stack 的(非静态)内部 class,它可以访问 Stack 实例 中的所有内容,包括所有通用信息。
Will it be redundant?
是的。
Why?
由于 Node
被声明为 Stack
的内部 class,变量 T
在 Node
的范围内,可以使用如所须。
Or may be need to use another character e.g.
<U>
?
如果您需要声明一个独特的类型变量,您可以这样做。 (事实上你可能应该使用不同的变量名。)它可能看起来像这样:
public class Stack<T> {
Node<T> top; // CHANGE HERE
class Node<U> { // CHANGE HERE
U value; // CHANGE HERE
Node<U> next; // CHANGE HERE
public Node(U value) { // CHANGE HERE
this.value = value;
next = null;
}
}
public void push(T value) {
Node<T> current = new Node<>(value); // CHANGE HERE
if (isEmpty())
top = current;
else {
current.next = top;
top = current;
}
}
public T pop() {
T value = null;
if (!isEmpty()) {
top = top.next;
value = top.value;
}
return value;
}
这说明添加额外类型变量会产生更多代码,但不会提高可读性。