此Java语法是什么意思? (`Class <!-?扩展了E-> clazz`)

时间:2019-03-31 14:58:39

标签: java

我需要一个自定义方法来检查包含类实例的列表并调用此方法,但是我不了解此语法“ 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;
    }

2 个答案:

答案 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是保留关键字,不能使用。