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

通过阅读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 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'
Groovy
myTask.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[]