所以我刚开始学习java泛型,我的老师给了我们这段代码
public class LinkedList<T> {
class Node<T>{
T info;
Node<T> next;
}
Node<T> head = new Node<T>();
/*
and here are supposed to be all the methods like add,remove... that use Class Node
*/
}
所以问题在于这一行
class Node<T>{
Eclipse <T>
给我&#34;类型参数T隐藏类型T&#34;警告
所以我删除它并使用
public class LinkedList<T> {
class Node{
T info;
Node next;
}
Node head = new Node();
/*
and here are supposed to be all the methods like add,remove... that use Class Node
*/
}
我现在没有收到任何警告,但它让我想知道代码是否做同样的事情?如果它没有什么区别?有人可以向我解释一下这个区别,还是指出了正确的方向? 非常感谢。
答案 0 :(得分:0)
这与具有与成员变量同名的局部变量或与超类中具有相同名称的子类中的成员变量非常相同:执行此操作是合法的,只是混淆为您指的是T
。
您实际上并不需要Node
上的类型变量:
public class LinkedList<T> {
class Node {}
}
因为Node
是LinkedList<T>
的内部类,所以它可以使用父类定义的T
。这就是你想要的:列表中的节点应该是与包含List
相关的类型(例如,Node<Integer>
中不会有LinkedList<String>
。< / p>
您可以Node
静态:
public class LinkedList<T> {
static class Node<T> {}
}
除了泛型,这很好,因为这意味着你的每个Node
个实例都没有包含对LinkedList
的引用 - 你几乎肯定不需要它。
现在它们是单独的类型变量。但请注意这里,现在令人困惑的是T
你的意思。您可以通过调用类型变量来更清楚地说明其他内容 - 比如S
。然后,您无法将LinkedList
上的类型与Node
上的类型混淆。
答案 1 :(得分:0)
代码运行时实际上没有T
。通用类型声明是Java 8时的编译时结构。
实际代码将完全删除您的泛型类型声明,并在没有它的情况下运行。
对于您拥有的代码,当您使用泛型类型声明在类中声明内部非静态类时,该内部类将使用与其外部类相同的类型。这就是为什么
class Node<T> {
T value;
Node<T> next;
}
据说是“隐藏通用类型签名”。
答案 2 :(得分:0)
由于外部类是Generic类,因此内部的所有内容都取决于该值,如果外部类已经是泛型,则内部类不需要特定的泛型类
答案 3 :(得分:0)
T被称为“有界类型参数”。所以当你想限制可以在参数化类型中用作类型参数的类型时。 所以下面的类与参数绑定。
ActiveCell.Formula = "=INDIRECT(" & VariableString & ")"
答案 4 :(得分:0)
由于function shadow() {
var matrix = $('.panzoom').panzoom("getMatrix");
$("#zoomf").html(matrix[0])
$('.machinebox:visible, .playerbox:visible').toggleClass("shadow", (matrix[0] > 0.35))
}
类未声明为静态,因此任何Node
对象都隐含引用它在其中创建的Node
。鉴于此,外部类LinkedList
中声明的T
类型参数也用于LinkedList
类。
例如,如果您在Node
的范围内创建Node
,则会隐式为LinkedList<String>
。
另一方面,如果Node<String>
类被声明为Node
,则必须将其声明为static
(或任何其他符号而不是Node<T>
),因为您无法使用T
中的T
类型。