Android:创建更短版本的findViewById - 未经检查的强制转换

时间:2016-10-10 14:24:10

标签: java android view findviewbyid

我写了一个方法来在Android中通过id获取视图,如下所示: 例如。

Button button = <Button>find(R.id.someId);

实际上不需要&lt;按钮取代。 这是我写的方法:

protected <T extends View> T find(int id){
    return (T) findViewById(id);
}

效果很好,但警告“Unchecked cast”让我感到困扰。我怎么能摆脱它? 这种方法可以保存吗? 我受到了Kotlin的启发,我想创建这个漂亮的小方法来使代码更漂亮。

3 个答案:

答案 0 :(得分:1)

您可以尝试使用@SuppressWarnings("unchecked"),它是一个注释,用于禁止有关未经检查的泛型操作(非异常)的编译警告,例如强制转换

根据它的Javadocs,它可以用于局部变量;这样,它甚至不会影响整个方法。

答案 1 :(得分:1)

警告就在那里,因为您不知道View是否真的是类型T,这会混淆正常的Android检查。

为什么不做你的

protected View find(int id){
    return findViewById(id);
}

然后

Button button = (Button)find(R.id.someId);

避免方法中的强制转换并使用泛型。

这同样短,不会导致此警告。

答案 2 :(得分:1)

根据这个答案,我提出了我想要的东西: How do I make the method return type generic?

protected <T extends View> T find(int id, Class<T> type){ 
    return type.cast(findViewById(id)); 
}

它允许我检索这样的视图:

Button button = find(R.id.someButton, Button.class);

我觉得很好。 感谢@Lev指出JakeWharton/butterknife,我从现在开始肯定会使用它。