如何保留CssColor实例列表?

时间:2013-11-03 01:16:52

标签: gwt

我有这样的事情:

List<CssColor> colors = new ArrayList<CssColor>();
colors.add(CssColor.make("#f00"));

我可以在开发模式下使用它:

context2d.setFillStyle(colors.get(0));

当我在生产中编译并运行它时,我得到一个例外。我得到的堆栈跟踪:

Unknown.RuntimeException_0
    Unknown.ClassCastException_0
    Unknown.dynamicCastJso
    Unknown.$getFillStrokeStyle   
    Unknown.$drawMyScene
    ...

如果我尝试使用定义如下的CssColor实例:

public static final CssColor RED = CssColor.make("#f00");

context2d.setFillStyle(RED);

在生产模式下也能正常工作。是否无法保留CssColor实例的集合?

由于

2 个答案:

答案 0 :(得分:0)

您的问题与动态投射检查有关。这是众所周知的问题,您可以在GWT: How to avoiding calls to dynamicCast and canCastUnsafe in generated JavaScript code?阅读更多相关内容,或只是在Google上搜索:gwt dynamic cast checking

您的问题有即时解决方案,但我不确定它是否是最佳的。如果您正在使用maven add gwt-compile参数disableCastChecking

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>gwt-maven-plugin</artifactId>
  <version>2.5.1</version>
  <configuration>
          ...
          <disableCastChecking>true</disableCastChecking>
           ...
  </configuration>

如果你不使用maven,那么只需添加gwt-compile参数: -XdisableCastChecking

答案 1 :(得分:0)

另一种解决方案,可能是这种解决方法:

//hold list of objects
List<Object> colors = new ArrayList<Object>();
colors.add(CssColor.make("#f00"));
Object fillStyle =  colors.get(0);

// create new csscolor
CssColor newColor = CssColor.make(fillStyle.toString());
context.setFillStyle(newColor);

但这绝对不优雅,只有在你别无选择时才能使用。

另一种解决方法(再次)是使用单元素表而不是对象本身:

 List<CssColor[]> colors = new ArrayList<CssColor[]>();
 colors.add(new CssColor[] { CssColor.make("#f00") });
 CssColor fillStyle = colors.get(0)[0];
 context.setFillStyle(fillStyle);