这是我所得到的:
public class Node<T> {
// instance variables
private Node<T> next;
private T data;
// construct with data
private Node(T data){
next = null;
this.data = data;
}
// construct without data
private Node(){
next = null;
this.data = null;
}
// static factory method
public static <T> Node<T> newNodeWithData(T data){
return new Node<T>(data);
}
// static factory method
public static <T> Node<T> newNode(){
return new Node<T>();
}
...
}
我的问题实际上只是关于泛型的语法与静态工厂方法的语法相结合。我不太明白why我们在方法声明中将放在返回类型之前。这有点像打字吗?任何帮助将非常感激!
你要问的是类型推断.
因为它是一个静态方法,所以它必须从某个地方推断出泛型类型;您没有该类的实例。这就是<T>
means.
如果您的方法不带参数,它实际上是从赋值的目标推断出来的。例如,假设您的方法如下所示:
public static <T> List<T> getNewList() {
return new ArrayList<T>();
}
使用此方法时,T
是从目标推断出来的(在本例中String
):
List<String> myList = MyClass.getNewList();
在您有通用参数的其他静态方法中,T
是从传入的类型推断出来的:
public static <T> List<T> getNewListWithElement(T element) {
List<T> list = new ArrayList<T>();
list.add(element);
return list;
}
在这里,如果您尝试这样做:
List<String> myList = MyClass.getNewListWithElement(new Integer(4));
它会告诉你你的目标类型是错误的,你需要一个List<Integer>
具体来说,这在各节中都有介绍15.12.2.7 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.7 and 15.12.2.8 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.8JLS 的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)