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、型チェックされた method 内で、型チェックされていないmethod の戻り値などを使用しますBBこの場合、 method の戻り値に関する十分な情報がないため、コンパイラがメソッドの型に一貫性があるかどうかを判断する方法がわかりません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 に答える