1

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 コード (複数のコード ファイル) を書き直し、extend を使用せずに 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)

一方、Java コードに置き換えるsuper.countsuper.size()、この C# コードに正常に変換されます。

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

要約すると、Sharpen はスーパー クラスのフィールドへのアクセスをサポートしていません。ただし、スーパー クラス メソッドへのアクセスはサポートされています。スーパー クラス フィールドに適切な置換がある場合、変換前に代替構造を使用するように Java コードを変更できます。

于 2012-06-18T07:09:36.297 に答える