Java阴影类型参数?我发现自己很难测试,因为Java泛型在运行时没有得到确认.
例如,给定此代码:
public class NestedGeneric<T> {
private InnerGeneric<T> innerGenericInstance;
private static class InnerGeneric<T> {
public T innerGenericField;
}
NestedGeneric() {
innerGenericInstance = new InnerGeneric<T>();
}
}
Run Code Online (Sandbox Code Playgroud)
以下两个语句编译正常:
NestedGeneric<Integer> test1 = new NestedGeneric<Integer>();
NestedGeneric.InnerGeneric<String> test2 = new NestedGeneric.InnerGeneric<String>();
Run Code Online (Sandbox Code Playgroud)
当NestedGeneric传递一个类型参数并调用其构造函数时,是什么T?它总是与传递给的类型参数相同nestedGeneric吗?
换句话说,可以将外部类类型参数传递给内部类泛型类型声明吗?
换句话说,我想问题是,是否可以将外部类类型参数传递给内部类泛型类型声明?
不.外部静态类和内部静态类之间没有关系(如继承或字段).您可以创建内部静态类的对象,而不像示例中那样依赖外部类:
NestedGeneric.InnerGeneric<String> test2 = new NestedGeneric.InnerGeneric<String>();
Run Code Online (Sandbox Code Playgroud)
但是,当您使用内部类的实例作为字段时,泛型类型派生自外部类:
private InnerGeneric<T> innerGenericInstance;
innerGenericInstance = new InnerGeneric<T>();
Run Code Online (Sandbox Code Playgroud)
第三种变体是将内部类定义为字段(非静态):
private class InnerGeneric<T> {
public T innerGenericField;
}
Run Code Online (Sandbox Code Playgroud)
现在它将从外部类中获取类型,因为它是一个成员变量.
正如评论中所指出的那样,定义内部静态类和外部类的类型只会让读者感到困惑(以及稍后的时间点).它应该用不同的通用声明
public class NestedGeneric<T> {
private InnerGeneric<T> innerGenericInstance;
private static class InnerGeneric<U> {
private U innerGenericField;
}
NestedGeneric() {
innerGenericInstance = new InnerGeneric<T>();
}
}
Run Code Online (Sandbox Code Playgroud)
这不是影子.您的代码中只有一个类型参数,即T参数.因此内部和外部T是相同的类型参数.
你当然可以有更多的类型参数.
public class NestedGeneric<OUTER_TYPE> {
private static class InnerGeneric<INNER_TYPE> {
public INNER_TYPE innerGenericField;
}
public NestedGeneric() {
InnerGeneric<OUTER_TYPE> innerGenericInstance = new InnerGeneric<OUTER_TYPE>();
InnerGeneric<String> secondInnerGenerics = new InnerGeneric<String>();
}
}
Run Code Online (Sandbox Code Playgroud)
的INNER_TYPE和OUTER_TYPE是两个不同类型的参数.线InnerGeneric<OUTER_TYPE> innerGenericInstance = new InnerGeneric<OUTER_TYPE>();将说thad innerGenericInstance是按照相同的类型进行参数化OUTER_TYPE.但它们不一定是一样的.因为它是secondInnerGenerics变量的情况.