C#中的Java等效代码

时间:2014-01-15 12:31:55

标签: c# java porting difference

我正在尝试将一些等效的C#代码写入以下Java代码:

public class XLexer extends antlr.CharScanner implements TokenStream {
protected int stringCtorState = 0;

public String mString() { return ""; }

public Token nextToken()  {
       resetText(); // exists in CharScanner class
       return null; // will return something
}

public TokenStream plumb() {
    return new TokenStream() {
        public Token nextToken()  {
            resetText(); // exists in CharScanner class
            if (stringCtorState >= 0) { String x = mString(); }
            return null; // will return something
        }
    };
}

}

任何人都可以给我一个提示如何在C#中执行此操作,因为我在return语句中定义方法nextToken时遇到错误。

谢谢!

3 个答案:

答案 0 :(得分:4)

C#中没有匿名类(在您需要的意义上)。如果要返回TokenStream的自定义实现的实例,则需要定义它并为其命名。

例如:

public MyTokenStream {
    public Token nextToken() {
        // ...
    }
}

public TokenStream plumb() {
    return new MyTokenStream();
}

请参阅:

供参考。

正如 kan 所述,在C#(以及Java 8中),您通常会使用委托或lambda。 如果TokenStream所做的都是返回nextToken,那么可以这样实现:

    public class TokenStream
    {
    }

    public class SomeClass
    {            
        public Func<TokenStream> Plumb()
        {
            // I'm returning a function that returns a new TokenStream for whoever calls it
            return () => new TokenStream();
        }
    }

    static void Main(string[] args)
    {
        var someClass = new SomeClass();
        TokenStream stream = someClass.Plumb()(); // note double brackets
    }

在JavaScript中思考一流函数,如果它有助于理解它。

New Java带来了类似的功能接口:http://java.dzone.com/articles/introduction-functional-1

答案 1 :(得分:1)

改为使用代理。这里有一个例子:http://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx

答案 2 :(得分:1)

不确定这是否是您想要的结果。

但我看到它的方式是你只想返回一个TokenStream对象,该对象的方法为nextToken,它返回一个对象Token

public class TokenStream
{
    public Token nextToken()
    {
         return new Token();
    }
}

那将是你的TokenStream类,然后你可以有一个方法/函数,其中包含以下内容

public TokenStream plumb()
{
    return new TokenStream();
}

其用法是

TokenStream ts = plumb();
Token t = ts.nextToken();