Java 如果声明中的泛型类型是';从来没用过吗?

Java 如果声明中的泛型类型是';从来没用过吗?,java,generics,htmlunit,Java,Generics,Htmlunit,我正在浏览HTMLUnit的源代码,不太清楚泛型类型在这里应该如何工作。它从未在方法中使用过,使方法通用有什么意义 public <T> List<T> getByXPath(final String xpathExpr) { PrefixResolver prefixResolver = null; if (hasFeature(XPATH_SELECTION_NAMESPACES)) { /*

我正在浏览HTMLUnit的源代码,不太清楚泛型类型在这里应该如何工作。它从未在方法中使用过,使方法通用有什么意义

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);