嵌套在泛型类中的私有类是否也应该泛型?

时间:2018-09-13 13:30:25

标签: java c# generics

Thread.currentThread().isInterrupted()

public class Foo<T>
{
    private class NestedWrapper
    {
        T Value;
    }
    private NestedWrapper MyNested;
}

在C#中,这两种方法之间是否有真正的区别?第二个中的其他public class Foo<T> { private class NestedWrapper<S> { S Value; } private NestedWrapper<T> MyNested; } 除外。

请注意,私有化有些重要,因为嵌套类无法从外部访问。并且我们可以假设<T>类将始终与其“父级”共享通用类型NestedWrapper

编辑:我实际上正在通过Java实现Thttp://fuseyism.com/classpath/doc/java/util/concurrent/atomic/AtomicMarkableReference-source.html在以下方面重新实现该类(它是Java标准库的一部分) C#。正如您在Java中看到的那样,使用了第二种样式。我什至不确定第一种样式在Java中是否有效(因为我不是Java程序员),但是在C#中我们仍然有两种可能的方法。我只是想知道是否有任何理由要优先于另一个。

2 个答案:

答案 0 :(得分:1)

  

这两种方法之间真的有区别吗?

是的,有一个真正的区别,因为NestedWrapper有自己的类型参数,而与Foo自己的类型参数无关。因此,实际类型可能完全不相关。

在第一种情况下,T被固定在NextedWrapper中,因此您没有机会为另一种类型创建包装器。

在第二种情况下,以下情况非常好:

private NestedWrapper<T> nestedWrappedT;
private NestedWrapper<int> nestedWrappedInt;
private NestedWrapper<string> nestedWrappedString;

仅凭private的事实就没有区别。

答案 1 :(得分:0)

在第一种方法中,为您的外部类设置T,然后在类中的任何地方使用它都不能更改(没有其他泛型类型,您将被绑定到T)。

>

在第二种方法中,您可以为外部和内部类分别设置通用类型。但是,由于此类是私有的,因此您将无法从类外部设置此通用参数。

区别在于您的类中有通用类(第二种方法)。您可以选择任何类型在班级内部使用它。 但是您无法从课堂之外对其进行控制。

在第一种方法中,您可以从类外部确定内部类应使用哪种类型。您可以从外部控制传递给内部类的泛型类型。