Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 嵌套在泛型类中的私有类也应该是泛型的吗? 公共类Foo { 私有类嵌套包装器 { T值; } 私有嵌套包装器MyNested; }_Java_C#_Generics - Fatal编程技术网

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;