为什么我无法通过泛型访问私有(嵌套)类成员?

Boa*_*ann 5 java oop generics

我有与此等效的东西:

class Main {
    public static class Data {
        private void foo() {}
    }
    
    public <D extends Data> D process(D data) {
        data.foo();
        return data;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨:

Main.Data 类型中的方法 foo() 不可见

我不明白为什么这不起作用。如果我不使用泛型,它编译得很好process

    public Data process(Data data) {
        data.foo();
        return data;
    }
Run Code Online (Sandbox Code Playgroud)

我想在这里使用泛型,这样我就可以保持一个流畅的接口,返回传入的 Data 的确切子类,但我也想将 Data 的基成员保持为外部类的私有。

为什么会发生这种情况?我有什么选择?

hun*_*ter 2

即使你不使用泛型,这个问题也会存在。D 不是编译器的“数据”,它是扩展“数据”的其他类型。

public class Main {

    public static class Data {
        private void foo() {}
    }
    
    public static class DataX extends Data
    {
        
    }  


    public DataX process(DataX data) {
        data.foo();  // will not be compiled because foo() has private access
        return data;
    }
}
Run Code Online (Sandbox Code Playgroud)

作为解决方案,您可以直接将其强制转换为 type 的局部变量Data,或者您可以以棘手的方式执行此操作(同样的事情,如果process方法内部有一些逻辑,则适合),如下所示。

public class Main {

    public static class Data {
        private void foo() {}
    }

    public <D extends Data> D process(D data) {
        internalProcess(data);
        return data;
    }
    
    private void internalProcess(Data data)
    {
        data.foo();
    }
}
Run Code Online (Sandbox Code Playgroud)