我正在尝试实现一个表示XML树的类,如下所示:
public class XML<T extends XML<T>> {
private final List<MarkupLanguage> nodeList = new ArrayList<>();
private final Map<String, String> attributeList = new HashMap<>();
public T attr(final String key, final String value) {
if (value != null) {
this.attributeList.put(key, value);
}
return (T) this;
}
public T appendTo(final T node) {
node.add(this);
return (T) this;
}
...
} 我的问题是输入这些子句--我得到了未经检查的"return (T) this;“
另外,当我尝试单独使用XML类时:
final XML url = new XML("url");
new XML("loc")
.add("http://goout.cz")
.appendTo(url);我得到了:
Unchecked cast to call appendTo(T) as a member of raw type XML.我如何改进我的代码以获得更好的输入?
发布于 2012-10-13 10:01:32
下面的方法如何(简单继承加上泛型方法):
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
public class XmlTest {
@Test
public void test() {
XMLFirstSubclass url = new XMLFirstSubclass("url");
XMLSecondSubclass xmlSecondSubclassInstance = new XMLSecondSubclass(
"loc").add("http://goout.cz").appendTo(url);
}
}
abstract class XML {
private final List<String> texts = new ArrayList<String>();
private final List<XML> nodes = new ArrayList<XML>();
private final String nodeName;
protected XML(String nodeName) {
this.nodeName = nodeName;
}
@SuppressWarnings("unchecked")
public <R extends XML> R add(String text) {
texts.add(text);
return (R) this;
}
@SuppressWarnings("unchecked")
public <R extends XML, T extends XML> R add(T node) {
nodes.add(node);
return (R) this;
}
@SuppressWarnings("unchecked")
public <R extends XML, T extends XML> R appendTo(T node) {
node.add(this);
return (R) this;
}
}
class XMLFirstSubclass extends XML {
public XMLFirstSubclass(String nodeName) {
super(nodeName);
}
}
class XMLSecondSubclass extends XML {
public XMLSecondSubclass(String nodeName) {
super(nodeName);
}
}请注意,泛型方法允许从一个类型T获取节点并返回实例的类型R,该类型可以与参数的类型不同。T可以不同于R,但两者都继承XML。
对问题中提出的方法的评论
到目前为止你使用的方法可能会导致奇怪的情况。让我们用一个例子来说明这一点。
下面,我们尝试编写第一个专门用于XML的类:
public class XMLFirstSubclass extends XML<OtherXMLSubclass> { ... }如果我们正在编写第一个XML子类,那么OtherXMLSubclass唯一可能的值是XMLFirstSubclass,或者根本不声明泛型类型。
第一个选项:
public class XMLFirstSubclass extends XML<XMLFirstSubclass> { ... }第二:
public class XMLFirstSubclass extends XML { ... }如果您选择在类设计中使用泛型,那么第二种选择似乎不太好。
仔细看看第一个选项,它打开了获得如下子类的可能性:
class XMLSecondSubclass extends XML<XMLFirstSubclass> {
...
}请注意,这可以很好地编译,但会在运行时在XMLSecondSubclass方法调用中导致类类型转换异常。
发布于 2012-10-13 08:38:00
只需键入它:
final XML<T> url = new XML<T>("url");
new XML<T>("loc")
.add("http://goout.cz")
.appendTo(url);看起来你真的想为你的方法使用XML<T>,而不是T,这样你就可以避免强制转换(但我可能错了):
public XML<T> attr(String key, String value) {
if (value != null) {
this.attributeList.put(key, value);
}
return this;
}
public XML<T> appendTo(XML<T> node) {
node.add(this);
return this;
}https://stackoverflow.com/questions/12868881
复制相似问题