4

s-java コンパイラのバリエーションを実装しようとしています。そのために、さまざまな変数を表すいくつかのクラスを作成しました。ある時点で、このような割り当て行int a = bが合法的な割り当てであるかどうかを確認したいと思います。(bは任意の変数である可能性があります)したがって、IntVariable aインスタンスを作成し、bはいくつかのインスタンスであり、bを実際にaに割り当てることができるかどうかをVariable確認しています。b instance of aこれはinstanceof使用例にすぎません。他にもいくつかのケースがあり (b は文字列リテラルまたは数値である可能性があります)、 を使用してinstanceof、私が知っているオプションのいずれかが存在し、代入が法的。

私の質問は次のとおりです。これを使用しないでより良い方法で行うことができますinstanceofか、それともそれほどきれいではありませんが、それでも機能し、他の方法ははるかに複雑であるという事実に耐えなければなりませんか?

編集:

public boolean convertable(Type other) {

  if (other instanceof FloatType || other instanceof DoubleType) {
     return true;
  }

     return false;
 }
4

2 に答える 2

0

あなたはs-javaコンパイラに取り組んでいるので、のclassオブジェクトを取得すればother、もっと多くのことができると思います

Class otherClass = other.getClass();

otherClass を取得したら、次のことができます。

otherClass.getClasses()

この Class オブジェクトによって表されるクラスのメンバーであるすべてのパブリック クラスおよびインターフェイスを表す Class オブジェクトを含む配列を返します。

また

otherClass.getDeclaredClasses()

この Class オブジェクトによって表されるクラスのメンバーとして宣言されたすべてのクラスとインターフェイスを反映する Class オブジェクトの配列を返します。

参照は次のとおりです。

Java リフレクションのチュートリアル: http://docs.oracle.com/javase/tutorial/reflect/class/classNew.html

Java リフレクション API: http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

于 2013-06-02T15:44:01.350 に答える
0

タイプを表す「タイプ」と呼ばれるある種のユニークなメタクラスを作成することもできます。特定のタイプ (IntType、FloatType など) ごとに、新しいクラスを作成できます。次に、変数には、特定の型への参照を返す getType() メソッドを含めることができます。「==」を使用して型を直接比較できるようになりました。「Type」は、最初の型を変換できる型のリストを返すメソッドを持つことができます。

例えば:

interface Type
{
    public Collection<Type> getConvertibleTypes();
}

そして、IntType:

class IntType implements Type
{
    public static final IntType INST = new IntType();

    private IntType()
    {
    }

    public Collection<Type> getConvertibleTypes()
    {
        Collection<Type> v = new Vector<Type>();
        v.add(FloatType.INST);
        return v;
    }
}
于 2013-06-02T15:46:17.087 に答える