Java:私有内部类被返回到外部代码

Xen*_*ate 0 java private list internal

我刚刚开始学习Java,来自C#背景.

当我开始使用Collections时,我注意到Arrays.asList()返回一个ArrayList<T>对象.

然而,我不明白的是,根据' docjar '(第2834行)的代码清单,标签ArrayList<T>私有.

如何使用已明确标记为隐藏的对象?或者(这是我怀疑的),私人对我假设的那个有什么不同的含义吗?

(另外,我注意到该类被标记为静态,这也让我感到困惑,但我会在另一个问题中提出这个问题)


编辑:C#中抛出编译器错误的示例:

public class PubClass {
        private class Blah {

        }

        public Blah GetBlah() {
            return new Blah();
        }
}
Run Code Online (Sandbox Code Playgroud)

给出:不一致的可访问性:返回类型'Namespace.PubClass.Blah'比方法'Namespace.PubClass.GetBlah()'更难访问

Jef*_*rey 6

ArrayList返回给你工具List,所有的包含在接口中的方法.既然List是公开的,你就知道那些方法并且可以调用它们.

ArrayList私有的原因是因为它没有理由公开:它不提供除List界面提供的任何附加功能.

/编辑
你的例子不能模仿这里发生的事情:

public interface List<T> {
    /** snip */
}

public class Arrays {
    private static class ArrayList<T> implements List<T> {
        /** snip */
    }

    public <T> List<T> asList(T... arr) {
        return new ArrayList<>(arr);
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的示例中,您尝试返回外部调用者不知道的私有类的实例.在该Arrays示例中,返回的对象实际上是a List(查看返回类型),而不是私有ArrayList.

  • 啊哈,我明白了;所以它返回“符合接口 List&lt;T&gt; 的东西,但你不需要知道那是什么”,而不是对象本身,我现在明白了,谢谢 (2认同)
  • @Motig您将无法使用它,也不应该尝试(使用反射).如果`ArrayList`类的制造者希望您能够使用该方法,那么他们就会将该类公之于众. (2认同)