通过阅读Gradle文档,我发现description
和dependsOn
都是Task
类的属性。
我们可以用不同的方式设置description
属性:
task MyTask
MyTask.description("This is MyTask")
MyTask.description "This is MyTask"
MyTask.description = "This is MyTask"
但即使dependsOn
也是属性,我们也只能:
task MyTask
task AnotherTask
MyTask.dependsOn(AnotherTask)
MyTask.dependsOn AnotherTask
因为无法使用:
MyTask.dependsOn = AnotherTask
错误是:
无法投射对象':AnotherTask''与班级 ' org.gradle.api.DefaultTask_Decorated' to class' java.lang.Iterable'
我无法理解在幕后做了什么样的演员。
它是仅涉及属性的=
运算符的强制转换吗?
答案 0 :(得分:2)
您仍然可以使用=
运算符来"分配"值dependsOn
属性,但您必须提供有效类型:
MyTask.dependsOn = [AnotherTask]
否则你会得到ClassCastException
:
> Cannot cast object 'task ':AnotherTask'' with class 'org.gradle.api.DefaultTask_Decorated' to class 'java.lang.Iterable'
myTask.x = ...
与调用myTask.setX(...)
方法这是正确的行为 - 如果你看一下org.gradle.api.Task
接口源代码,你会发现description
不是一个字段,而是一对getter和setter方法:
@Internal
String getDescription()
void setDescription(String var1);
同样适用于dependsOn
"属性":
@Internal
Set<Object> getDependsOn()
void setDependsOn(Iterable<?> var1)
在这种情况下,Groovy允许您像访问属性一样访问这两个方法,但它会将执行传递给这些方法。所以当你这样做时:
MyTask.description
您实际上是致电MyTask.getDescription()
。当你这样做时:
MyTask.description = 'This is description'
您实际上是致电MyTask.setDescription('This is description')
MyTask.dependsOn()
案例还有一件值得一提的关于dependsOn
案例的事情。正如我之前提到的org.gradle.api.Task
界面包含Set<Object> getDependsOn()
和void setDependsOn(Iterable<?> var1)
。但那还不是全部。还有一种方法:
Task dependsOn(Object... var1);
它期望varargs(类型Object
的单个参数或Object[]
的数组)。在这种情况下,您可以执行以下方法调用:
MyTask.dependsOn AnotherTask // -> equivalent of MyTask.dependsOn(AnotherTask)
MyTask.dependsOn([AnotherTask] as Object[])
但你不能打电话:
MyTask.dependsOn [AnotherTask]
MyTask.dependsOn [AnotherTask] as Object[] // -> equivalent of (MyTask.dependsOn [AnotherTask]) as Object[]
第一种情况不会起作用,因为您需要将集合显式地转换为Obejct[]
数组。第二个也不会工作,因为必须将转换到Object[]
应用于参数。在这种情况下跳过括号会导致编译器尝试将强制转换应用于方法的结果,并且我们从第一种情况开始使用ClassCastException
。
我希望它有所帮助。