在泛型类中,Class<T>
该方法getConstructors()
的返回类型具有未知的泛型类型参数,而不是T
。原因是javadoc中的explainend。
请注意,虽然此方法返回一个
Constructor<T>
对象数组(即此类的构造函数数组),但此方法的返回类型为Constructor<?>[]
并且不是Constructor<T>[]
预期的。这种信息量较少的返回类型是必需的,因为从此方法返回后,可以修改该数组以容纳不同类的Constructor对象,这将违反的类型保证Constructor<T>[]
。
我和我的一位同事试图理解这种解释。根据我们的理解,他们基本上是说它是未知的泛型类型,因为某些调用者可以将其他Constructor
对象放入该数组中。我们说对了吗?如果是这样,为什么有人会以此方式设计API。使用特定类型并信任程序员可以正确使用数组会更好吗?对我们来说,这听起来有点像“我们正在开发更糟糕的API,因为使用它的程序员可能会尝试一些愚蠢的东西”。我们的谬论在哪里?
Ashu Pachauri在评论中提到的观点(即,返回数组是为了向后兼容)当然是有效的。通常,数组和泛型不能很好地配合使用。(作为证据,查找与“通用数组”相关的所有stackoverflow问题...)
此外,有一个规则,即API应该易于使用且难以滥用。在这种情况下,这与最小惊讶原则有关:使用此方法获得构造函数的人可以对返回的数组执行完全合法的操作序列,最后收到意外的ClassCastException
。因此,可以说Constructor<?>[]
返回数组的事实旨在实现“快速失败”行为。
一个示例:
import java.lang.reflect.Constructor;
public class GetConstructorsReturnType
{
public static void main(String[] args) throws Exception
{
// This causes a warning, due to the cast, but imagine
// this was possible
Constructor<DerivedA> constructorsA[] =
(Constructor<DerivedA>[])DerivedA.class.getConstructors();
// The following lines are valid due to the subtype
// relationship, but would not be valid if constructorsA
// was declared as "Constructor<?>"
Constructor<? extends Base> constructors[] = constructorsA;
constructors[0] = DerivedB.class.getConstructor();
// This causes a ClassCastException (and would also not
// be possible constructorsA was declared as "Constructor<?>"
DerivedA instance = constructorsA[0].newInstance();
}
}
class Base
{
}
class DerivedA extends Base
{
public DerivedA()
{
}
}
class DerivedB extends Base
{
public DerivedB()
{
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句