1

我有这样的事情:

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 实例的集合吗?

谢谢

4

2 回答 2

0

您的问题与动态转换检查有关。这是已知问题,您可以在此处阅读更多相关信息GWT:如何避免在生成的 JavaScript 代码中调用 dynamicCast 和 canCastUnsafe?或者只是在谷歌上搜索:gwt dynamic cast checking

您的问题有即时解决方案,但我不确定它是否是最佳的。如果您使用 maven 添加 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

于 2013-11-03T11:58:38.257 回答
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);
于 2013-11-03T12:20:06.457 回答