我正在尝试将一些等效的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时遇到错误。
谢谢!
答案 0 :(得分:4)
C#中没有匿名类(在您需要的意义上)。如果要返回TokenStream
的自定义实现的实例,则需要定义它并为其命名。
例如:
public MyTokenStream {
public Token nextToken() {
// ...
}
}
public TokenStream plumb() {
return new MyTokenStream();
}
请参阅:
http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
http://www.25hoursaday.com/CsharpVsJava.html(匿名内部类列在“Wish You Were Here”部分; “本节描述Java中存在的语言特性和概念,没有C#对应”)。
供参考。
正如 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();