基于内部类型参数的类型声明 类
Type declaration based on type parameters in inner classes
Java 阴影类型参数吗?我发现自己很难测试,因为 Java 泛型不会在 运行 时间得到具体化。
例如,给定此代码:
public class NestedGeneric<T> {
private InnerGeneric<T> innerGenericInstance;
private static class InnerGeneric<T> {
public T innerGenericField;
}
NestedGeneric() {
innerGenericInstance = new InnerGeneric<T>();
}
}
以下两个语句都可以正常编译:
NestedGeneric<Integer> test1 = new NestedGeneric<Integer>();
NestedGeneric.InnerGeneric<String> test2 = new NestedGeneric.InnerGeneric<String>();
当NestedGeneric
传递一个类型参数并调用其构造函数时,T
是什么?它总是与传递给 nestedGeneric
的类型参数相同吗?
换句话说,可以将外部 类 类型参数传递给内部 类 泛型类型声明吗?
In other words, I suppose the question is, can an outer classes type
parameters be passed to an inner classes generic type declarations?
没有。外部和内部 static class 之间没有关系(如继承或作为字段)。您可以创建一个内部静态 class 的对象,而不依赖于外部 class,就像您的示例中那样:
NestedGeneric.InnerGeneric<String> test2 = new NestedGeneric.InnerGeneric<String>();
但是,当您使用内部 class 的 实例 作为字段时,通用类型派生自外部 class:
private InnerGeneric<T> innerGenericInstance;
innerGenericInstance = new InnerGeneric<T>();
第三种变体是将 内部 class 定义为字段(非静态):
private class InnerGeneric<T> {
public T innerGenericField;
}
现在将从外部 class 获取类型,因为它是一个成员变量。
正如评论中所指出的那样,用类型定义内部静态和外部 class 只会让 reader(以及你自己在稍后的时间点)感到困惑。它应该用不同的泛型来声明,比如
public class NestedGeneric<T> {
private InnerGeneric<T> innerGenericInstance;
private static class InnerGeneric<U> {
private U innerGenericField;
}
NestedGeneric() {
innerGenericInstance = new InnerGeneric<T>();
}
}
是,但不使用静态修饰符:
public class NestedGeneric<T> {
private InnerGeneric<T> innerGenericInstance;
private class InnerGeneric<T> {
private T innerGenericField;
public InnerGeneric(T innerGenericField){
this.innerGenericField = innerGenericField;
}
public T getInnerGenericField(){
return this.innerGenericField;
}
}
NestedGeneric(T someGenericVariable) {
innerGenericInstance = new InnerGeneric<T>(someGenericVariable);
T innerGenericField = innerGenericInstance.innerGenericInstance();
}
}
这不是阴影。您的代码中只有一个类型参数,即 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>();
}
}
INNER_TYPE
和OUTER_TYPE
是两个不同类型的参数。行 InnerGeneric<OUTER_TYPE> innerGenericInstance = new InnerGeneric<OUTER_TYPE>();
会说 innerGenericInstance
的参数化类型与 OUTER_TYPE
相同。但它们不必相同。就像 secondInnerGenerics
变量的情况一样。
Java 阴影类型参数吗?我发现自己很难测试,因为 Java 泛型不会在 运行 时间得到具体化。
例如,给定此代码:
public class NestedGeneric<T> {
private InnerGeneric<T> innerGenericInstance;
private static class InnerGeneric<T> {
public T innerGenericField;
}
NestedGeneric() {
innerGenericInstance = new InnerGeneric<T>();
}
}
以下两个语句都可以正常编译:
NestedGeneric<Integer> test1 = new NestedGeneric<Integer>();
NestedGeneric.InnerGeneric<String> test2 = new NestedGeneric.InnerGeneric<String>();
当NestedGeneric
传递一个类型参数并调用其构造函数时,T
是什么?它总是与传递给 nestedGeneric
的类型参数相同吗?
换句话说,可以将外部 类 类型参数传递给内部 类 泛型类型声明吗?
In other words, I suppose the question is, can an outer classes type parameters be passed to an inner classes generic type declarations?
没有。外部和内部 static class 之间没有关系(如继承或作为字段)。您可以创建一个内部静态 class 的对象,而不依赖于外部 class,就像您的示例中那样:
NestedGeneric.InnerGeneric<String> test2 = new NestedGeneric.InnerGeneric<String>();
但是,当您使用内部 class 的 实例 作为字段时,通用类型派生自外部 class:
private InnerGeneric<T> innerGenericInstance;
innerGenericInstance = new InnerGeneric<T>();
第三种变体是将 内部 class 定义为字段(非静态):
private class InnerGeneric<T> {
public T innerGenericField;
}
现在将从外部 class 获取类型,因为它是一个成员变量。
正如评论中所指出的那样,用类型定义内部静态和外部 class 只会让 reader(以及你自己在稍后的时间点)感到困惑。它应该用不同的泛型来声明,比如
public class NestedGeneric<T> {
private InnerGeneric<T> innerGenericInstance;
private static class InnerGeneric<U> {
private U innerGenericField;
}
NestedGeneric() {
innerGenericInstance = new InnerGeneric<T>();
}
}
是,但不使用静态修饰符:
public class NestedGeneric<T> {
private InnerGeneric<T> innerGenericInstance;
private class InnerGeneric<T> {
private T innerGenericField;
public InnerGeneric(T innerGenericField){
this.innerGenericField = innerGenericField;
}
public T getInnerGenericField(){
return this.innerGenericField;
}
}
NestedGeneric(T someGenericVariable) {
innerGenericInstance = new InnerGeneric<T>(someGenericVariable);
T innerGenericField = innerGenericInstance.innerGenericInstance();
}
}
这不是阴影。您的代码中只有一个类型参数,即 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>();
}
}
INNER_TYPE
和OUTER_TYPE
是两个不同类型的参数。行 InnerGeneric<OUTER_TYPE> innerGenericInstance = new InnerGeneric<OUTER_TYPE>();
会说 innerGenericInstance
的参数化类型与 OUTER_TYPE
相同。但它们不必相同。就像 secondInnerGenerics
变量的情况一样。