复杂泛型类型声明的解释.什么类<?扩展类<?延伸演员> []>实际意味着什么?

Pap*_*sar 3 java generics types class

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

public class Actor {...}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Viv*_*ath 6

是.让我们从内到外工作:

  • ? extends Actor意味着某种东西Actor或任何亚型Actor.
  • Class<? extends Actor>[]表示一个Class<T>对象数组,其中每个对象表示一个Actor或者是其子类型的类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();
Run Code Online (Sandbox Code Playgroud)

这里要注意的重要一点是,这个巨大的表达式并不代表一个本身扩展了一个Class<? extends Actor>对象数组的.取而代之的是,它代表了类的阵列Class<? extends Actor>对象.

*从技术上讲,你不能创建一个泛型类型的数组,这意味着它Class<? extends Actor>[]只是Class[].所以最终你最终会得到Class<Class[]>,这是代表一个Class对象数组的类(即,只是Class[].class).