1

我正在尝试在 Eclipse 中使用 Sharpen 将 java 项目(完整源代码)转换为 C#

我遵循了这个博客的指导方针,效果很好:http ://tumblr.com/ZVuYOwDv6mdu (建议在源代码控制上使用 Lluis Sanchez 的 Sharpen 编译版本)

但是我在一些扩展 ByteArrayInputStream 和 ByteArrayOutputStream 的类中遇到了错误。对“super”的属性和方法的任何引用都返回“Failed to map”

例子:

[exec] 错误:/sharpened/src/com/netnumber/dns/message/DnsOutputStream.java:176:映射失败:'this.nameTable.put(name,new Integer(super.count))' [exec] java .lang.IllegalArgumentException: /sharpened/src/com/netnumber/dns/message/DnsOutputStream.java:176: 映射失败:'this.nameTable.put(name,new Integer(super.count))'

我想知道通过 Sharpen 是否有任何简单的解决方案,或者我是否需要花时间重新编写 java 代码(多个代码文件)以“模仿”引用而不使用扩展,然后使用编写 C# 代码MemoryStream 在最终转换的代码项目中?

4

1 回答 1

2

我做了一个很简单的测试,下面的转换确实会失败:

public class DnsOutputStream extends ByteArrayOutputStream {
  public int count() {
    return super.count;
  }
}

具体的错误信息表明不支持访问超类中的某个字段:

 [exec] Caused by: java.lang.IllegalArgumentException: /sharpened/src/DnsOutputStream.java:16: super.count
 [exec]     at sharpen.core.CSharpBuilder.notImplemented(CSharpBuilder.java:243)
 [exec]     at sharpen.core.CSharpBuilder.visit(CSharpBuilder.java:227)
 [exec]     at org.eclipse.jdt.core.dom.SuperFieldAccess.accept0(SuperFieldAccess.java:165)
 [exec]     at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2514)
 [exec]     at sharpen.core.CSharpBuilder.mapExpression(CSharpBuilder.java:3343)

另一方面,如果我super.countsuper.size()Java代码替换成功转换成这个C#代码:

public class DnsOutputStream : ByteArrayOutputStream {
  public virtual int Count()
  {
    return base.Size();
  }
}

总结:Sharpen 不支持访问超类中的字段。但是,支持访问超类方法。当存在超类字段的适用替换时,Java 代码可以因此被修改以在转换之前使用替代构造。

于 2012-06-18T07:09:36.297 回答