[英]Explanation for convoluted generic-type declaration. What does Class<? extends Class<? extends Actor>[]> actually mean?
想象一下,我们有这门课。
public class Actor {...}
然后我们有一个方法需要一个类型的参数:
Class<? extends Class<? extends Actor>[]>
这甚至可能吗? 我无法破译它。
是。 让我们从内到外工作:
? extends Actor
? extends Actor
意味着什么是Actor
或任何亚型Actor
。 Class<? extends Actor>[]
Class<? extends Actor>[]
指的阵列Class<T>
对象,其中每个对象表示一个类,或者是Actor
或者是其亚型Actor
。 Class<? extends Class<? extends Actor>[]>
Class<? extends Class<? extends Actor>[]>
表示类对象数组的类 ,其中每个对象都是Actor
或其子类型之一。 * 这是一个应该让它更清晰的例子:
//actorClass is a Class<T> object that represents Actor.class
//or any of its subtypes
Class<? extends Actor> actorClass = Actor.class;
//classArray is an array of Class<? extends Actor> objects, and so its type is
//Class<? extends Actor>[]
//You will get a warning about an unsafe cast here because you
//cannot really create an array of generic type, which means the
//RHS type is just `Class[]`.
Class<? extends Actor>[] classArray = new Class[] {
actorClass, actorClass, actorClass
};
//Now we get the class of the array itself, which matches the convoluted
//expression you saw.
Class<? extends Class<? extends Actor>[]> classArrayClass = classArray.getClass();
这里要注意的重要一点是,这个巨大的表达式并不代表一个类本身扩展了一个Class<? extends Actor>
Class<? extends Actor>
对象。 相反, 它代表 Class<? extends Actor>
的数组的Class<? extends Actor>
Class<? extends Actor>
对象。
*从技术上讲, 你不能创建一个泛型类型的数组 ,这意味着Class<? extends Actor>[]
Class<? extends Actor>[]
真的只是Class[]
。 所以最终你最终会得到Class<Class[]>
,它是表示Class
对象数组的Class
(即,只是Class[].class
)。
有趣。 让我们给这个类型一个更短的名字“CCA”
CCA = Class<? extends Class<? extends Actor>[]>
扩展第一个通配符,
CCA = all Class<T> where T <: Class<? extends Actor>[]
对于数组子类型,我们必须有
T = A[] where A <: Class<? extends Actor>
因此
CCA = all Class<A[]> where A <: Class<? extends Actor>
如果我们探索Class
是final
的事实,那么A必须是
A = Class<C> or Class<? extends C> where C <: Actor
因此
CCA = all Class<Class<C>[]> and Class<Class<? extends C>[]> where C<:Actor
意思是,CCA涵盖了表示Class<Actor>[]
, Class<BadActor>[]
, Class<? extends BadActor>[]
等数组的类对象Class<? extends BadActor>[]
Class<? extends BadActor>[]
等。
另一方面 ......我们知道T
不能是Class<T>
任意类型。 虽然语法上Class<List<String>>
是有效的,但List<String>
实际上没有类; 只有班级List
; 因此只有Class<List>
才有意义。
而且......对于数组,即使有像List<String>[]
, List<Integer>[]
这样的编译时类型,也只有一个运行时类,对应于List[]
。
因此,CCA实际上只是Class<Class[]>
; 这种类型只有一个对象 - Class[].class
,即表示数组类型Class[]
。
鉴于CCA类型的对象,您无法用它做任何有趣的事情。 我很想知道你在哪里看到这种类型,以及实际用例是什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.