我有与此等效的东西:
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 的基成员保持为外部类的私有。
为什么会发生这种情况?我有什么选择?
即使你不使用泛型,这个问题也会存在。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)