Java 如果声明中的泛型类型是';从来没用过吗?
我正在浏览HTMLUnit的源代码,不太清楚泛型类型在这里应该如何工作。它从未在方法中使用过,使方法通用有什么意义Java 如果声明中的泛型类型是';从来没用过吗?,java,generics,htmlunit,Java,Generics,Htmlunit,我正在浏览HTMLUnit的源代码,不太清楚泛型类型在这里应该如何工作。它从未在方法中使用过,使方法通用有什么意义 public <T> List<T> getByXPath(final String xpathExpr) { PrefixResolver prefixResolver = null; if (hasFeature(XPATH_SELECTION_NAMESPACES)) { /*
public <T> List<T> getByXPath(final String xpathExpr) {
PrefixResolver prefixResolver = null;
if (hasFeature(XPATH_SELECTION_NAMESPACES)) {
/*
* See if the document has the SelectionNamespaces property defined. If so, then
* create a PrefixResolver that resolves the defined namespaces.
*/
final Document doc = getOwnerDocument();
if (doc instanceof XmlPage) {
final ScriptableObject scriptable = ((XmlPage) doc).getScriptableObject();
if (ScriptableObject.hasProperty(scriptable, "getProperty")) {
final Object selectionNS =
ScriptableObject.callMethod(scriptable, "getProperty", new Object[]{"SelectionNamespaces"});
if (selectionNS != null && !selectionNS.toString().isEmpty()) {
final Map<String, String> namespaces = parseSelectionNamespaces(selectionNS.toString());
if (namespaces != null) {
prefixResolver = new PrefixResolver() {
@Override
public String getBaseIdentifier() {
return namespaces.get("");
}
@Override
public String getNamespaceForPrefix(final String prefix) {
return namespaces.get(prefix);
}
@Override
public String getNamespaceForPrefix(final String prefix, final Node node) {
throw new UnsupportedOperationException();
}
@Override
public boolean handlesNullPrefixes() {
return false;
}
};
}
}
}
}
}
return XPathUtils.getByXPath(this, xpathExpr, prefixResolver);
}
public List getByXPath(最终字符串xpathExpr){
PrefixResolver PrefixResolver=null;
if(hasFeature(XPATH\u选择\u名称空间)){
/*
*查看文档是否定义了SelectionNamespaces属性。如果是,则
*创建解析已定义名称空间的PrefixResolver。
*/
最终文档doc=getOwnerDocument();
if(XmlPage的文档实例){
最终ScriptableObject scriptable=((XmlPage)doc.getScriptableObject();
if(ScriptableObject.hasProperty(可编写脚本,“getProperty”)){
最终对象选择=
callMethod(可编写脚本,“getProperty”,新对象[]{“SelectionNamespaces”});
if(selectionNS!=null&&!selectionNS.toString().isEmpty()){
最终映射名称空间=parseSelectionNamespaces(selectionNS.toString());
if(名称空间!=null){
prefixResolver=新的prefixResolver(){
@凌驾
公共字符串getBaseIdentifier(){
返回名称空间。get(“”);
}
@凌驾
公共字符串getNamespaceForPrefix(最终字符串前缀){
返回名称空间.get(前缀);
}
@凌驾
公共字符串getNamespaceForPrefix(最终字符串前缀,最终节点){
抛出新的UnsupportedOperationException();
}
@凌驾
公共布尔handlesNullPrefixes(){
返回false;
}
};
}
}
}
}
}
返回XPathUtils.getByXPath(this,xpathExpr,prefixResolver);
}
它用于返回类型(List
),因此返回的List
将具有特定的泛型类型。这也意味着XPathUtils.getByXPath(…)
返回一个列表,因为这是它在方法底部返回的内容,所以它在方法内部使用。这里的泛型用于将T
类型输入XPathUtils.getByXPath
方法,哪个签名是
public static <T> List<T> getByXPath(DomNode node, String xpathExpr, PrefixResolver resolver)
它从外部的getByXPath
方法推断T
类型,而外部的getByXPath
方法又从调用中推断T
因此,如果调用List=page.getByXPath(expr)
然后HtmlDivision
将被推断为getByXPath
,然后被推断为XPathUtils。getByXPath
这个问题仍然有效。在这种特殊情况下,泛型似乎是多余的。唯一的可能性是此
对象是一个泛型对象,因此它不是多余的,因为否则返回值将仅具有类型列表
,而期望从该方法得到List
的代码将导致编译时错误,因为List
不是List
。那么它确实应该声明为List getByXPath(String)
。这类代码在Java中看起来应该非常可疑:当列表的类型完全由调用方决定时填充列表。事实上。基本上,他们只是希望您将结果分配到正确的列表中,如果您不这样做,那么,我希望您喜欢调试。他们应该让你把类
传递给这个方法。这样会更安全。
return XPathUtils.getByXPath(this, xpathExpr, prefixResolver);