2

Java CodeModel ライブラリを使用してコードを生成しようとしています。生成されたコードで、型キャストを実行する必要があります。こんなものが欲しい…

foo.setBar( ((TypeCastToThis)someVariable).getBar() );

ライブラリで見つけた唯一のサポートは、JCast JExpr.cast(JType type, JExpression expr)を使用することです。ただし、Eclipse によると、戻り値の型である JCast は public ではありません。正確なエラーは、「タイプ com.sun.codemodel.JCast が表示されません」です。

これが私がやっていることの簡単な例です。

import java.io.File;

import com.sun.codemodel.JBlock;
import com.sun.codemodel.JCast;  //<-- Eclipse flags this as an error
import com.sun.codemodel.JClass;
import com.sun.codemodel.JClassAlreadyExistsException;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JDefinedClass;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JMethod;
import com.sun.codemodel.JMod;
import com.sun.codemodel.JVar;



public class CastTest
{

    public static void main(String[] args) throws JClassAlreadyExistsException
    {
        // TODO Auto-generated method stub

        JCodeModel codeModel = new JCodeModel();
        JDefinedClass testClass = codeModel._class("MyTestClass");

        JMethod testMeth = testClass.method(JMod.PUBLIC, codeModel.VOID, "TypeCastTestMethod");

        JBlock testMethBody = testMeth.body();

        JVar castMeVar = testMethBody.decl(codeModel.INT, "castMe", JExpr.lit(42));

        JClass typeCastToThisClass = codeModel.directClass("TypeCastToThis");

        JCast castResult = JExpr.cast(typeCastToThisClass, castMeVar);

        testMethBody.decl(typeCastToThisClass, "theTypeCastedObject", castResult);

        codeModel.build(new File("/path/to/output/directory"));
    }

    /*

    The generated code should look like this.

    public void TypeCastTestMethod()
    {
        int castMe = 42;
        TypeCastToThis theTypeCastedObject = (TypeCastToThis)castMe;
    }

    */
}

ライブラリを間違って使用していますか、または目標を達成するための別の方法はありますか?

4

1 に答える 1

7

後でこの問題が発生した場合は、JExpr.cast(....) の戻り値で JCast から JExpression への暗黙的なアップキャストを使用することで回避できます。JCast は JExpression のサブタイプです。

から....

JCast castResult = JExpr.cast(typeCastToThisClass, castMeVar);

に.....

JExpression castResult = JExpr.cast(typeCastToThisClass, castMeVar);
于 2012-05-07T19:00:02.403 に答える