2016-12-19 4 views
1

与えられる以下のグルービーコード:驚くべき挙動

def engine = new SimpleTemplateEngine() 
def propMap = [ URL: "http://stackoverflow.com",URL2: "http://stackoverflow.com"] 
def result = engine.createTemplate(''' 

${URL} 
${URL2} 

''').make(propMap) as String 
println(java.net.URL) 

出力(クラスjava.net.URLとして解釈されてしまう

class java.net.URL 
http://stackoverflow.com 
どういうわけ

URLありますGroovyは自動インポートのようですが)、なぜですか?この文脈ではURLという名前の変数を使用できますか?

+0

URL、String、Fileなどの変数はありません。小文字は問題ありませんが、実際のクラス名をシャドーすると常に問題が発生します –

+0

@tim_yates:名前を避けることは可能ですが、なぜGroovyそんなやり方でそれを解釈する? Javaでは、コーディング規格に準拠していない場合でも、その名前を使用することが可能です...もちろん、Groovyは動的言語であるが、それは、デフォルトでは、そのクラスをインポートしているので、まだそれは – user140547

+0

意外なようです –

答えて

2

Groovyはまたjava.netを含む、いくつかのdefault importsを作っています。インポートjava.net.URLは明らかにローカル変数をシャドウします。

thisを使用して、Groovyにjava.net.URLの代わりに変数を使用するように明示的に指示することができます。 (URL)暗黙的および明示的な(JavaURL)輸入の両方を使用したので、

import java.net.URL as JavaURL

が、それは本当に助けていませんでした:

${this.URL} 
${URL2} 

私はまた、このように輸入のエイリアスを使用しようとしました。

関連する問題