作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
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 类之间没有关系(如继承或作为字段)。您可以像示例中那样创建内部静态类的对象而不依赖于外部类:
NestedGeneric.InnerGeneric<String> test2 = new NestedGeneric.InnerGeneric<String>();
然而,当您使用内部类的实例作为字段时,泛型类型派生自外部类:
private InnerGeneric<T> innerGenericInstance;
innerGenericInstance = new InnerGeneric<T>();
第三种变体是将内部类定义为字段(非静态):
private class InnerGeneric<T> {
public T innerGenericField;
}
现在将从外部类获取类型,因为它是一个成员变量。
正如评论中所指出的那样,用类型定义内部静态和外部类只会让读者(以及稍后的你自己)感到困惑。它应该用不同的泛型来声明,比如
public class NestedGeneric<T> {
private InnerGeneric<T> innerGenericInstance;
private static class InnerGeneric<U> {
private U innerGenericField;
}
NestedGeneric() {
innerGenericInstance = new InnerGeneric<T>();
}
}
关于java - 内部类中基于类型参数的类型声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31052476/
我是一名优秀的程序员,十分优秀!