通过阅读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
错误是:
我不明白幕后将进行哪种类型的 Actor 表转换。
它是否仅涉及属性的
=
运算符的转换? 最佳答案
您仍然可以使用=
运算符将值“分配”给dependsOn
属性,但是您必须提供有效的类型:
MyTask.dependsOn = [AnotherTask]
否则,您会得到
ClassCastException
:> Cannot cast object 'task ':AnotherTask'' with class 'org.gradle.api.DefaultTask_Decorated' to class 'java.lang.Iterable'
Groovy
myTask.x = ...
与调用myTask.setX(...)
方法这是正确的行为-如果查看
org.gradle.api.Task
接口(interface)源代码,您会发现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
接口(interface)包含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
结尾。希望对您有所帮助。