2011-03-09 47 views
2

有人可以向我解释下面这行在Java中的含义,以及如何将它转换为C#?谢谢。将Java的一行转换为C#

private class X extends Y<Void, Object, Void> { 
....... 
} 
+0

看起来像泛型,但我从来没有像那样使用它。 – Nate 2011-03-09 16:02:54

回答

2

在Java中,当您真的不关心该类型参数时,可以使用java.lang.Void作为类型参数,并且它始终为null。例如:

public interface Command<T> { 
    T execute(); 
} 

public class VoidReturningCommand implements Command<Void> { 
    public Void execute() { 
    // executes .... 
    return null; // don't care about the return... 
    } 
} 

在C#,System.Void不能使用这样。

所以,沟通的对象实际上是无效,你可以为它创建一个uninstantiatable类型:

public sealed class Nothingness { 
    private Nothingness() { } 
} 

,然后使用它:

private class X : Y<Nothingness, object, Nothingness> { 

} 

null是唯一有效的值为Nothingness

(我想为Nothingness类的其它名称包括NullNothing - 坏VB.NET - ,VoidUnitIgnoredMu - 你决定哪一个是最适合你)

这载有意图将原始Java代码转换为C#。

+0

谢谢你解释这个。 – basheps 2011-03-09 21:31:53

4

类X inheritsgeneric class Y.在Y类有三个泛型参数。 X用参数Void,ObjectVoid扩展Y类。

在C#中,这将如下所示:

private class X : Y<object, object, object> { 
} 

正如在评论中提到的,无效的,不能作为一种类型过去了,所以你必须在C#中通过至少object


此代码看起来很腥。 Y类需要知道三种类型,其中两种是你的never want to assign a non-null value to(无效类型)。

+1

void不是C#中的一个类型或别名,它只是一个关键字,您的代码将无法使用“关键字”void在此上下文中无法使用。 – 2011-03-09 16:03:38

+0

@VirtualBlackFox,'void' *是一个类型,或者说是结构System.Void的一个别名。但是你是正确的,你不能在这里使用它。 – 2011-03-09 16:07:37

+0

@Anthony Pegram:实际上...... void不是C#语言中的类型或任何别名。 System.Void表示IL级别的空返回类型,在处理反射时可以看到。例如,请参阅规范中属于特殊外壳类型(void)的部分,从不指定结果与System.Void有任何关系。在当前的微软编译器中,很明显void在大多数情况下并不是特殊的,只是System.Void的别名,但它在规范中的任何地方都没有指定。 – 2011-03-09 16:32:13

0

这意味着它将功能添加到类Y,它需要一些通用对象类型来实例化。

在C#这看起来像

private class X : Y<null, Object, null> 
{ 

} 

这就是所谓的inheritance其中X继承该基类Y的属性。

但我不认为你可以像这样通过null

+3

剪切的原始代码使用'void',这在C#中显然不起作用。但都不会“空”。 – 2011-03-09 16:06:37

+0

@Anyhony Pegram,是的,我正在想如何做到这一点。 – msarchet 2011-03-09 16:11:38

2

Steven的回答看起来不太对 - void不能在C#中以这种方式使用。

相反,你可以代表什么void Java实现作为Action或.NET也许Func,因为这样(省略任何复杂性,例如限制):

private class Y<T, K, Z> { } 

private class X : Y<Action, object, Action> 
{ 

} 

这里发生的事情是,我们”重新定义X,这是一个类,继承YY实际上是一个通用类型(其中的利用类型减少了需要,甚至希望在这里使用object),因此也暴露了尖括号内的参数 - 例如,这意味着可以将object更改为Fruit并且可以使用任何子分类类型实例化Y,例如Apple

有关继承的信息,请参见here,关于泛型的信息请参见here

虽然这整个实现有点倒退,除非X试图隐藏有关底层类型及其参数的信息。

一个稍微复杂的例子只是为了说明一个可以如何使用泛型和继承可能看起来有点像这样:

public abstract class Fruit { } 

    public class Apple : Fruit { } 

    public class Pear : Fruit { } 

    public class LunchBox<A> 
     where A : Fruit 
    { 
     public A FruitSnack { get; set; } 
    } 

    public class LunchBox<A, B> : LunchBox<A> 
     where A : Fruit 
     where B : Fruit 
    { 
     public B ExtraFruitSnack { get; set; } 
    } 

    var myLunchBox = new LunchBox<Apple>(); 

    var myBiggerLunchBox = new LunchBox<Apple, Pear>(); 
+1

嗯,我会坚持对象,而不是行动,因为我更喜欢认为我有一个空对象比null委托。 – 2011-03-09 16:09:19

+0

@Matías:但是,'object'不能做任何事情,'Action'可以。 – 2011-03-09 16:10:52

+0

无论如何,我相信这个问题是无用的,C#方法将以另一种不同于Java的解决方案和“无效”方案结束。 – 2011-03-09 16:12:34

0

指私家类X继承Y舱,和Y有3个通用的参数:无效,对象和无效。

在C#中不能使用“无效”作为泛型类型参数,所以它看起来像这样:

private class X : Y<object, object, object> 
{ 
} 

这将返回void现在返回null对象的成员。就这样。