Java 嵌套在泛型类中的私有类也应该是泛型的吗? 公共类Foo { 私有类嵌套包装器 { T值; } 私有嵌套包装器MyNested; }
或Java 嵌套在泛型类中的私有类也应该是泛型的吗? 公共类Foo { 私有类嵌套包装器 { T值; } 私有嵌套包装器MyNested; },java,c#,generics,Java,C#,Generics,或 公共类Foo { 私有类嵌套包装器 { S值; } 私有嵌套包装器MyNested; } 在C#中,这两种方法之间有什么真正的区别吗?其他,然后在第二个中添加 请注意,私有有些重要,因为嵌套类在外部是不可访问的。我们可以假设NestedWrapper类将始终与其“父类”共享泛型类型T EDIT:我实际上正在经历AtomicMarkableReference在Java中的实现:我正在C#中重新实现这个类(它是Java标准库的一部分)。正如您在Java中看到的,使用了第二种样式。我甚至不确定第
公共类Foo
{
私有类嵌套包装器
{
S值;
}
私有嵌套包装器MyNested;
}
在C#中,这两种方法之间有什么真正的区别吗?其他,然后在第二个中添加
请注意,私有有些重要,因为嵌套类在外部是不可访问的。我们可以假设NestedWrapper
类将始终与其“父类”共享泛型类型T
EDIT:我实际上正在经历AtomicMarkableReference
在Java中的实现:我正在C#中重新实现这个类(它是Java标准库的一部分)。正如您在Java中看到的,使用了第二种样式。我甚至不确定第一种样式在Java中是否有效(因为我不是Java程序员),但在C#中我们仍然有两种可能的方法。我只是想知道是否有什么理由喜欢其中一个而不是另一个
这两种方法之间有什么真正的区别吗
是的,有一个真正的区别,因为NestedWrapper
有自己的类型参数,独立于Foo
自己的类型参数。因此,实际类型可能完全不相关
在第一种情况下,T
固定在NextedWrapper
中,您没有机会为其他类型创建包装
在第二种情况下,以下情况非常好:
public class Foo<T>
{
private class NestedWrapper<S>
{
S Value;
}
private NestedWrapper<T> MyNested;
}
private nestedWrappedT;
私有嵌套包装器嵌套包装器;
私有嵌套包装嵌套包装;
事实上,它是私有的,这没有什么区别。在第一种方法中,
T
是为您的外部类设置的,然后在类中的任何地方使用,它都不能更改(如果没有额外的泛型类型,您将被绑定到T
)
在第二种方法中,您可以为外部类和内部类分别设置泛型类型。但是,因为这个类是私有的,所以您不能从类外部设置这个泛型参数
不同之处在于类中有泛型类(第二种方法)。您可以在类中选择任何类型来使用它。
但是你在课堂之外无法控制它
在第一种方法中,您可以从类外部决定应该在内部类中使用哪种类型。您可以从外部控制传递给内部类的泛型类型。如果它是私有类,这有关系吗?如果您不打算指定包含类正在使用的同一泛型类型以外的任何内容,那么它只会增加噪音,所以不要这样做。如果您确实需要处理不同的类型,那么您就没有其他选择了。您是否有过
T
和S
会有所不同的用例?如果没有,第二个就更复杂了,没有任何好处。Java和C#有完全不同的泛型实现。他们甚至对private
的含义有不同的看法。厌倦了把知识从一个传递到另一个。如果你想发布一个关于Java为什么这样做的问题,你可能会得到更深刻的答案——这可能是一个很好的理由,但它一般不会推广到C#泛型类中的私有类。好吧,在C#中,你不会这样做。因此,了解为什么在Java中,它们会这样做是非常重要的。但这需要Java专家,而不是C#专家。(理想情况下,两者都是,但我绝对不是Java专家。)我建议您针对这种情况提出一个问题——特别是因为它显然是关于并发代码的,而并发代码本身就有不同语义的麻烦。可能有替代方案意味着重新实现此代码甚至不是您真正需要的代码>在第一种情况下。@Damien_不信者哦,是的,你是对的。我的观点主要是关于这两种类型的独立性。
public class Foo<T>
{
private class NestedWrapper<S>
{
S Value;
}
private NestedWrapper<T> MyNested;
}
private NestedWrapper<T> nestedWrappedT;
private NestedWrapper<int> nestedWrappedInt;
private NestedWrapper<string> nestedWrappedString;