【问题标题】:How to pass a Class as an function parameter如何将类作为函数参数传递
【发布时间】:2020-04-06 20:34:37
【问题描述】:

我知道以前有人问过这个问题,但我不太明白/答案对我没有帮助,所以在我开始学习 Java 时,我希望能在这个问题上得到一些帮助。

我想创建一个函数来计算一个类的实例并返回一个数字,例如我有:

Public class A{}
Public class A.a extends A{}
Public class A.b extends A{}

我有一个 A[] 数组,其中包含 A、A.a 和 A.b 的实例,我想计算该数组中 A、A.a 或 A.b 的实例,所以我创建了这些函数:

int countA.a(A[] array){
int counter = 0;
  for(int i = 0; i < array.length; i++){
    if(array[i] instanceof A.a){
      counter++;
    }
  }
  return counter;
}

int countA.b(A[] array){
int counter = 0;
  for(int i = 0; i < array.length; i++){
    if(array[i] instanceof A.b){
      counter++;
    }
  }
  return counter;
}

我的问题是,我该怎么做这样的事情:

int countInstances(A[] array, class n){
int counter = 0;
  for(int i = 0; i < array.length; i++){
    if(array[i] instanceof n){
      counter++;
    }
  }
  return counter;
}

感谢您的耐心等待!

【问题讨论】:

    标签: java arrays class object parameters


    【解决方案1】:

    您可以使用Class 类:

    int countInstances(A[] array, Class<? extends A> n){
    

    您应该使用Class 类中的isInstance 方法,而不是instanceof。

    if(n.isInstance(array[i])){
      counter++;
    }
    

    用法:

    int count = countInstances(someArray, SubclassOfA.class);
    

    【讨论】:

    • 如果n 是A.class 并且array 只包含A 的子类,那么计数是否仍会作为array 的长度返回(因为子类是A)?
    • List.class.isInstance(new ArrayList()); List.class.isInstance(new LinkedList&lt;&gt;()); 都是真的
    • @AndrewS instanceof 运算符也是如此。
    【解决方案2】:

    你可以使用A.class获取一个类型的Class,或者使用一个实例来获取

    A myA = new A();
    Class<?> clazzOfA = myA.getClass();
    

    并将其作为Class&lt;?&gt;类型的参数传递

    所以在你的例子中,类似于:

    int instances = countInstances(myArray, A.b.class);
    
    int countInstances(A[] array, Class<?> n){
    int counter = 0;
      for(int i = 0; i < array.length; i++){
        if(array[i].getClass() == n){
          counter++;
        }
      }
      return counter;
    }
    

    一些例子:

    boolean hasSameClass(Object type, Class<?> n){
        return type.getClass() == n;
    }
    
    hasSameClass(new LinkedList(), ArrayList.class);    // false
    hasSameClass(new ArrayList(), LinkedList.class);    // false
    hasSameClass(new ArrayList(), ArrayList.class);     // true
    hasSameClass(new ArrayList(), List.class);          // false
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 2021-01-14
      • 2014-07-09
      相关资源
      最近更新 更多