锐化Eclipse - 无法映射 - 超级引用

时间:2012-01-03 23:00:27

标签: c# java eclipse sharpen-tool

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

我遵循了此博客的指南,该指南非常有效:http://tumblr.com/ZVuYOwDv6mdu(建议使用Lluis Sanchez的Sharpen编译版本来源控件)

但是我在ByteArrayInputStream和ByteArrayOutputStream上扩展的几个类中遇到错误。对“超级”的属性和方法的任何引用都将返回“无法映射”

示例:

  

[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代码(多个代码文件)以“模仿”引用而不使用extends然后编写在最终转换的代码项目中使用MemoryStream的C#代码?

1 个答案:

答案 0 :(得分: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.count替换super.size(),则Java代码会成功转换为此C#代码:

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

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