1

我看到从 Groovy 2.0 开始,可以TypeChecked向类或方法添加注释以触发可选的静态检查

我必须承认,我对这样的事情如何运作感到困惑。文章给出了简单的例子,例如

@TypeChecked
Date test() {
    // compilation error:
    // cannot assign value of Date 
    // to variable of type int
    int object = new Date()

    String[] letters = ['a', 'b', 'c']
    // compilation error:
    // cannot assign value of type String 
    // to variable of type Date
    Date aDateVariable = letters[0]

    // compilation error:
    // cannot return value of type String 
    // on method returning type Date
    return "today"
}

在这种情况下,很明显某些检查会失败。但在一般情况下,会A在类型检查的方法内部使用方法的返回值,即未类型检查的返回值B。在这种情况下,我看不到编译器如何确定方法B类型是否一致,因为它没有足够的关于方法返回值的信息A

一般而言,如何在不丢失类型安全的情况下对代码子集启用类型检查?

编辑

我试着举个例子。如果我有一个旧班级怎么办

class Old {
  public getFoo() {
    return 1
  }
}

并尝试从经过类型检查的代码中使用它,例如

@TypeChecked
class New {
  int doubleFoo() {
    return 2 * (new Old().foo)
  }
}

编译器只是不知道该怎么做,我猜它会编译失败(我这里没有安装 Groovy2 来检查)。但如果是这种情况,那么使用任何在 Groovy2 之前编写的代码都会成为问题。所以我想象一些更复杂的事情已经完成,但我不确定是什么。

4

1 回答 1

1

不存在这样的问题。如果您从未经检查的类中调用方法,则使用声明的返回类型,并且行为与使用 Groovy 中的 Java 方法完全相同。

举个例子:

class A {
   int foo() { 1 }
}

@TypeChecked
class B {
   void bar() {
       int x = new A().foo() // uses the type from A.foo, correct
   }
}

现在,想象一下:

class A {
   Date foo() { new Date() }
}

@TypeChecked
class B {
   void bar() {
       int x = new A().foo() // uses the type from A.foo, foo returns a Date, the compiler throws an error
   }
}

请注意,通常,如果您的代码严重依赖于类型检查器显然无法检查的动态代码,则您可以在单个类中使用混合类型检查。例如,如果您依赖构建器,就会出现这种情况。如果是这样,那么您只需将使用构建器的方法声明为未检查,然后检查其余代码。只要未经检查的方法返回兼容的类型,就可以保证类型安全。

于 2012-09-18T08:50:18.277 回答