繁体   English   中英

复杂泛型类型声明的解释。 什么类 <? extends Class<? extends Actor> []&gt;实际意味着什么?

[英]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>

如果我们探索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>[]等数组的类对象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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM