如何使用Sun / Oracle CodeModel库键入强制转换?

时间:2012-05-01 21:07:47

标签: java code-generation sun-codemodel

我正在尝试使用Java CodeModel library生成一些代码。在我生成的代码中,我需要执行类型转换。我想要这样的东西......

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

我在图书馆找到的唯一支持就是使用JCast JExpr.cast(JType type, JExpression expr)。但是根据Eclipse,返回类型JCast不是公共的。确切的错误是:“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;
    }

    */
}

我是否错误地使用了图书馆和/或是否有另一种方法来实现我的目标?

1 个答案:

答案 0 :(得分:6)

如果其他人之后遇到此问题,则可以通过使用JCast对JExpression的JExpression(J)的JExpression进行隐式向上转发来绕过它。 JCast是JExpression的子类型。

从....

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

要.....

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