我有这样的事情:
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实例的集合?
由于
答案 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);