回答:
名前付きパッケージのデフォルトパッケージのクラスは使用できません。
(技術的にはあなたのことができ、Shariqueアブドラさんのように答えリフレクションAPIを介して、しかし、無名の名前空間のクラスがある範囲内にないで輸入申告)
J2SE 1.4より前のバージョンでは、次のような構文を使用してデフォルトパッケージからクラスをインポートできました。
import Unfinished;
それはもはや許されない。したがって、パッケージ化されたクラス内からデフォルトのパッケージクラスにアクセスするには、デフォルトのパッケージクラスを独自のパッケージに移動する必要があります。
groovyによって生成されたソースにアクセスできる場合は、ファイルを専用パッケージに移動し、この「パッケージ」ディレクティブを最初に追加するために、いくつかの後処理が必要です。
2014年の更新:JDK7およびJDK8のバグ6975015には、名前のないパッケージからのインポートをさらに厳しく禁止することが記述されています。
TypeName
クラス型、インタフェース型、列挙型、または注釈型の正規の名前でなければなりません。
型は、名前付きパッケージのメンバーであるか、最も外側の字句的に囲む型が名前付きパッケージのメンバーである型のメンバーである必要があります。そうでない場合、コンパイル時エラーが発生します。
「そもそも[デフォルトのパッケージ]があるのはなぜですか?設計エラーですか?」
いいえ、それは意図的です。
JLS 7.4.2。名前のないパッケージは言う:「名前のないパッケージは、主に小規模または一時的なアプリケーションを開発するとき、または開発を始めるときの便宜のために、Java SEプラットフォームによって提供されます」。
実際、それは可能です。
リフレクションAPIを使用すると、これまでにどのクラスにもアクセスできます。少なくとも私は次のことができました:)
Class fooClass = Class.forName("FooBar");
Method fooMethod = fooClass.getMethod("fooMethod", String.class);
String fooReturned = (String)fooMethod.invoke(fooClass.newInstance(), "I did it");
val bar = "hi"; val fooClass = Class.forName("FooClass"); val fooMethod = fooClass.getMethod("foo", classOf[Array[String]]); val fooReturned = fooMethod.invoke(fooClass.newInstance(), Array(bar));
Class.forName("FooBar").newInstance().fooMethod("I did it")
Groovy
コード内でパッケージを使用でき、問題なく動作します。
最初はコードの小さな再編成とgrails-app
最初は少し苦痛を意味するかもしれませんが、大規模なGrailsプロジェクトでは、物事をパッケージに編成することは理にかなっています。Java標準パッケージの命名規則を使用しますcom.foo.<app>.<package>
。
あなたが見つけているように、デフォルトのパッケージにすべてのものがあると、統合の妨げになります。
コントローラーは、Javaパッケージに入れられないようにする1つのGrailsアーティファクト(またはアーティファクト)のようです。たぶんConvention
、まだそのことを理解していません。;-)