我需要一个自定义方法来检查包含类实例的列表并调用此方法,但是我不了解此语法“ Class clazz”,并且我不了解此方法的第二个参数是什么
public static <E> boolean containsInstanceOfOidInrArraylist(List<E> Arraylist, Class<? extends E> clazz) {
for (E e : Arraylist) {
if (clazz.isInstance(e)) {
return true;
}
}
return false;
}
答案 0 :(得分:0)
好吧,因此函数的第一个参数是名为List<E>
的{{1}}(您不应在Java中使用大写字母,而应将其命名为Arraylist
)。
第二个参数是名为arrayList
的{{1}}。
检查Class<? extends E>
中的manub's explaination:
clazz
是可参数化的类,因此可以使用以下语法Class<?>
,其中Class
是一种类型。通过编写Class<T>
,您可以声明一个T
对象可以是任何类型(Class<?>
是通配符)。Class
type是一种包含有关类的元信息的类型。
所以现在您知道?
的含义了,但是Class
呢?
Class<?>
基本上是指<strong>任何扩展E(或E本身)的类。
因此Class<? extends E>
意味着您有一个名为<? extends E>
的变量,它是Class<? extends E> clazz
类或clazz
的子类。
答案 1 :(得分:0)
请参阅本教程:https://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html
“上界通配符
您可以使用上限通配符来放宽对变量的限制。例如,假设您想编写一种适用于List<Integer>
,List<Double>
和List<Number>
的方法;您可以使用上限通配符来实现。
要声明一个上限的通配符,请使用通配符('?'),后跟extend关键字,然后是其上限。请注意,在这种情况下,extends通常用于表示“扩展”(如在类中)或“实现”(如在接口中)。
第二个参数是一个与列表中对象的类相同或对其进行扩展的类。 clazz用作变量名,因为class是保留关键字,不能使用。