我编写了一个函数来遍历Android视图并查找给定类的所有子项。有一点麻烦,但自动更正,我终于让它工作。问题是我不明白它为什么会起作用(总是吓人的)。
有两件事让我感动:
@SuppressWarnings("unchecked")
?<classType>
被调用和应该做什么?我更愿意理解我的代码而不是盲目地去理解它的作用。
@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;
}
答案 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)
@SuppressWarnings("unchecked")
是一个注释,它使方法中的某些类编译器警告静音,例如将超类对象强制转换为子类类型而不首先检查与instanceof
的兼容性,例如: (classType)current_child
。这些警告的目的是在编译时发现潜在的ClassCastException
和其他问题。
classType
用于代码中的两个稍微混乱的角色。首先,它是<>
中的泛型类型参数。搜索“java generics”以获取更多信息。另外,它是Class<?> classType
中的参数名称,它与通用类型参数不同。
答案 3 :(得分:0)
“classType”可能是类实例上的声明,如:
公共类MyClass {
private T classType;
}
这意味着您将存储一个类作为参考,在您使用的情况下用于识别孩子。
需要抑制警告bcs你没有办法确保在你没有检查实例的情况下投射时类型是正确的......