Gradle 为什么不可能访问;“德彭森”;及;说明“;任务属性是否以相同的方式?
通过阅读Gradle文档,我发现Gradle 为什么不可能访问;“德彭森”;及;说明“;任务属性是否以相同的方式?,gradle,groovy,Gradle,Groovy,通过阅读Gradle文档,我发现description和dependsOn都是任务类的属性。 我们可以用不同的方式设置description属性: task MyTask MyTask.description("This is MyTask") MyTask.description "This is MyTask" MyTask.description = "This is MyTask" 但即使dependsOn也是一个属性,我们也只能拥有: task MyTask task Another
description
和dependsOn
都是任务
类的属性。
我们可以用不同的方式设置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
错误是:
无法强制转换对象“任务”:具有类的另一个任务“”
将“org.gradle.api.DefaultTask”修饰为类“java.lang.Iterable”
我不明白这是一个什么样的演员。
是否仅涉及属性的
=
运算符的强制转换?您仍然可以使用=
运算符为Dependenson
属性“赋值”,但必须提供有效的类型:
MyTask.dependsOn = [AnotherTask]
否则会得到ClassCastException
:
> Cannot cast object 'task ':AnotherTask'' with class 'org.gradle.api.DefaultTask_Decorated' to class 'java.lang.Iterable'
GroovymyTask.x=…
vs.调用myTask.setX(…)
方法
这是正确的行为-如果您查看org.gradle.api.Task
接口源代码,您会发现description
不是一个字段,而是一对getter和setter方法:
@Internal
String getDescription()
void setDescription(String var1);
这同样适用于dependsOn
“属性”:
您实际上调用了MyTask.getDescription()
。当你这样做的时候:
MyTask.description
MyTask.description = 'This is description'
您实际上调用了MyTask.setDescription('这是描述')
MyTask.dependsOn()
case
关于dependsOn
案例,还有一件事值得一提。正如我前面提到的org.gradle.api.Task
接口包含Set 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[]
array。第二个也不起作用,因为强制转换到对象[]
必须应用于参数。在这种情况下,跳过括号会导致编译器尝试对方法的结果应用强制转换,结果是第一种情况下的ClassCastException
我希望有帮助。这很有帮助。因此MyTask.dependsOn=[AnotherTask]和MyTask.dependsOn([AnotherTask])都在工作。无效的是MyTask.dependsOn[TaskB]。怎么会?如果我们使用后一种表示法,我们是否不尊重setDependsOn()所期望的类型?@acezjazz否,
MyTask.dependsOn[TaskB]
是一个不同的故事-Task
接口包含方法Task dependsOn(Object…var1)
。而MyTask.dependsOn[TaskB]
相当于MyTask.dependsOn([TaskB])
调用,因为groovy允许跳过括号。在这种情况下正确的调用应该是MyTask.dependsOn([TaskB]as Object[])
,因为您必须将ArrayList
强制转换为Object[]
-编译器不会隐式执行此操作。而且因为Task dependsOn(Object…var1)
使用varargs,只需使用一个或多个用coma分隔的参数即可。如果您想将列表传递给Task dependsOn(Object…var1)
您必须显式地强制转换到Object[]
我马上就到了,对不起!如果,如您所说,MyTask.dependsOn[TaskB]
与MyTask.dependsOn([TaskB])
是等价物,为什么后者有效而第一个无效?这就像as Object[]
cast仅在括号之间是隐式的。@没有区别,因为在Groovy中括号在某些情况下是可选的(链接:)。但在您的情况下-如果您想将参数转换为对象[]
,则必须添加括号,明确指出必须转换为对象[]
的部分。
MyTask.dependsOn [AnotherTask]
MyTask.dependsOn [AnotherTask] as Object[] // -> equivalent of (MyTask.dependsOn [AnotherTask]) as Object[]