我正在尝试在自定义 Ant 标记中添加嵌套类型,如 http://ant.apache.org/manual/develop.html#nested-elements 中所述。但我不断收到异常 outer 不支持嵌套的“innerone”元素。
我花了整个上午的时间进行谷歌搜索,但我找不到任何使用此模式来解决此问题的示例、教程或任何帮助,我开始怀疑它是否已实现!
我的构建文件:
<?xml version="1.0"?>
<project name="test" default="tester" basedir="../../..">
<taskdef name="outer" classname="tester.Outer" classpath="target/classes"/>
<typedef name="innerone" classname="tester.Outer$InnerOne" classpath="target/classes"/>
<typedef name="innertwo" classname="tester.Outer$InnerTwo" classpath="target/classes"/>
<target name="tester">
<innerone/>
<innertwo/>
<outer>
<innerone/>
<innertwo/>
</outer>
</target>
</project>
Java代码:
public class Outer extends Task
{
private List<Inner> inners = new ArrayList<Inner>();
public void add(Inner inner) {
inners.add(inner);
System.out.println("Add: ");
}
public void addConfigured(Inner inner) {
inners.add(inner);
System.out.println("AddConfigured: ");
}
public void execute() {
for (Inner inner : inners) {
System.out.println("Inner: " + inner.getMsg());
}
}
public interface Inner {
String getMsg();
}
public static class InnerOne implements Inner {
public String getMsg() {
return "One";
}
}
public static class InnerTwo implements Inner {
public String getMsg() {
return "Two";
}
}
}
使用方法 addInner(Inner inner)
和 addConfiguredInner(Inner inner)
都可以,但我希望能够添加实现内部接口(interface)的内部标签,而无需必须在外部类中显式地为它们创建方法。
最佳答案
您的示例与您在 ant 手册中链接的示例非常相似。它们之间有什么区别,一种有效,另一种无效?虽然走了很长的路,但一步一步让它们越来越相似,我发现了区别。
在typedef
中必须给出loaderRef
属性,等于classpath
。 typedef task的文档说:
Use this to allow multiple tasks/types to be loaded with the same loader, so they can call each other.
使用 antlib 可能会使这个问题不存在,因为它是在一个 ant 脚本行中声明的。
最后答案是:是的,它们确实有效:)
关于java - add(Interface) 和 addConfigured(Interface) 方法真的有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12690635/