想象一下,我们有这门课。
public class Actor {...}
然后我们有一个方法需要一个类型为的参数:
Class<? extends Class<? extends Actor>[]>
这甚至可能吗?我无法破译它。
答案 0 :(得分:6)
是。让我们从内到外发挥作用:
? extends Actor
表示Actor
或Actor
的任何子类型。Class<? extends Actor>[]
表示Class<T>
个对象的数组,其中每个对象代表一个Actor
或Actor
的子类型的类。Class<? extends Class<? extends Actor>[]>
表示类对象数组的类,其中每个对象都是Actor
或其子类型之一。 * < / LI>
这是一个应该让它更清晰的例子:
//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>
个对象的数组类。
* 从技术上讲,you can't create an array of a generic type,这意味着Class<? extends Actor>[]
实际上只是Class[]
。所以最终你最终会得到Class<Class[]>
,这是代表Class
个对象数组的类(即Class[].class
}。
答案 1 :(得分:3)
有趣。让我们给这个类型一个更短的名字“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>[]
等。
另一方面 ...我们知道T
中Class<T>
不能是任意类型。虽然语法Class<List<String>>
有效,但List<String>
实际上没有类;只有班级List
;因此只有Class<List>
才有意义。
而且......对于数组,即使有像List<String>[]
,List<Integer>[]
这样的编译时类型,也只有一个运行时类,对应List[]
。
因此,CCA实际上只是Class<Class[]>
;这种类型只有一个对象 - Class[].class
,即表示数组类型Class[]
的类。
鉴于CCA类型的对象,你可以用它做任何有趣的事情。我很想知道你在哪里看到这种类型,以及实际用例是什么。