方法声明的这一部分叫做什么?

时间:2014-02-10 18:18:44

标签: android

我编写了一个函数来遍历Android视图并查找给定类的所有子项。有一点麻烦,但自动更正,我终于让它工作。问题是我不明白它为什么会起作用(总是吓人的)。

有两件事让我感动:

  1. 为什么需要@SuppressWarnings("unchecked")
  2. 方法声明中第一个<classType>被调用和应该做什么?
  3. 我更愿意理解我的代码而不是盲目地去理解它的作用。

    @SuppressWarnings("unchecked")
    public <classType> ArrayList<classType> findChildrenByClass(Class<?> classType, ViewGroup viewGroup) {
      ArrayList<classType> returns = new ArrayList<classType>();
      View current_child;
      ArrayList<classType> new_children;
    
      if (viewGroup.getChildCount() > 0) {
        for (int i=0;i<viewGroup.getChildCount();i++) {
          current_child = (View)viewGroup.getChildAt(i);
    
          if (current_child.getClass().equals(classType)) {
            returns.add((classType)current_child);
          }
    
          if (current_child instanceof ViewGroup 
              && ((ViewGroup)current_child).getChildCount() > 0
              ) {
            new_children = findChildrenByClass(classType, (ViewGroup)current_child);
            returns.addAll(new_children);
          }
        }
      }
    
      return returns;
    }
    

    编辑:为了帮助像我这样困惑的其他人,这是最终修订版

    public <T> ArrayList<T> findChildrenByClass(Class<T> classType, ViewGroup viewGroup) {
      ArrayList<T> returns = new ArrayList<T>();
      View current_child;
      ArrayList<T> new_children;
    
      if (viewGroup.getChildCount() > 0) {
        for (int i=0;i<viewGroup.getChildCount();i++) {
          current_child = (View)viewGroup.getChildAt(i);
    
          if (current_child.getClass().equals(classType)) {
            returns.add((T)current_child);
          }
    
          if (current_child instanceof ViewGroup 
              && ((ViewGroup)current_child).getChildCount() > 0
              ) {
            new_children = findChildrenByClass(classType, (ViewGroup)current_child);
            returns.addAll(new_children);
          }
        }
      }
    
      return returns;
    }
    

4 个答案:

答案 0 :(得分:1)

抑制警告是不报告编译器将提出的警告,如未使用的变量或折旧方法。

不需要抑制警告,您的程序仍然有效。

&LT; classType&gt;是泛型的。阅读泛型,但基本上输入一个参数。

在您的情况下,如果您想要返回某些内容,则第一个Class类型是返回类型。如果您不想返回任何内容,请使用void。

答案 1 :(得分:1)

  

@SuppressWarnings( “未登记”)

这只是从编译器中删除警告,例如,编译器可能会警告您未使用的变量,可能的NullPointerExceptions,不推荐的方法等。这告诉编译器不要警告这些事情。通常你这样做是因为你不关心警告,例如你正在使用一些不推荐的方法。

  

classType所

这就是我们所说的Java Generics,您可以阅读完整的解释here。基本上,它们允许您创建通用类。例如,ArrayList&lt;&gt;是一个泛型类,您可以将列表与您想要的任何对象一起使用,因此您不必为要存储的每种数据类型编写完整的新实现:

ArrayList<Object>
ArrayList<String>
ArrayList<Integer>

答案 2 :(得分:1)

  1. @SuppressWarnings("unchecked")是一个注释,它使方法中的某些类编译器警告静音,例如将超类对象强制转换为子类类型而不首先检查与instanceof的兼容性,例如: (classType)current_child。这些警告的目的是在编译时发现潜在的ClassCastException和其他问题。

  2. classType用于代码中的两个稍微混乱的角色。首先,它是<>中的泛型类型参数。搜索“java generics”以获取更多信息。另外,它是Class<?> classType中的参数名称,它与通用类型参数不同。

答案 3 :(得分:0)

“classType”可能是类实例上的声明,如:

公共类MyClass {

private T classType;

}

这意味着您将存储一个类作为参考,在您使用的情况下用于识别孩子。

需要抑制警告bcs你没有办法确保在你没有检查实例的情况下投射时类型是正确的......