复杂泛型类型声明的解释。什么类<! - ?扩展类<?延伸演员 - > []&gt;实际上意味着

时间:2015-07-07 21:18:11

标签: java class generics types

想象一下,我们有这门课。

public class Actor {...}

然后我们有一个方法需要一个类型为的参数:

Class<? extends Class<? extends Actor>[]>

这甚至可能吗?我无法破译它。

2 个答案:

答案 0 :(得分:6)

是。让我们从内到外发挥作用:

  • ? extends Actor表示ActorActor的任何子类型。
  • Class<? extends Actor>[]表示Class<T>个对象的数组,其中每个对象代表一个ActorActor的子类型的类。
  • 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>

如果我们探究Classfinal的事实,那么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>[]等。

另一方面 ...我们知道TClass<T>不能是任意类型。虽然语法Class<List<String>>有效,但List<String>实际上没有类;只有班级List;因此只有Class<List>才有意义。

而且......对于数组,即使有像List<String>[]List<Integer>[]这样的编译时类型,也只有一个运行时类,对应List[]

因此,CCA实际上只是Class<Class[]>;这种类型只有一个对象 - Class[].class,即表示数组类型Class[]的类。

鉴于CCA类型的对象,你可以用它做任何有趣的事情。我很想知道你在哪里看到这种类型,以及实际用例是什么。