Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓-正在使用';instanceof';确定“中的微调器返回的项目类型的唯一方法”;“是否选中?”;?_Java_Android_Listener_Spinner_Instanceof - Fatal编程技术网

Java 安卓-正在使用';instanceof';确定“中的微调器返回的项目类型的唯一方法”;“是否选中?”;?

Java 安卓-正在使用';instanceof';确定“中的微调器返回的项目类型的唯一方法”;“是否选中?”;?,java,android,listener,spinner,instanceof,Java,Android,Listener,Spinner,Instanceof,如标题所示— 是否有任何方法可以确定从中的微调器获得的项目类型(通常是字符串,如果是从资源改编的,或者是通用对象,如果是通过编程改编的,则是从中选择的?在本例中,我指的是在Java中以编程方式填充的,但据我所知,对于从字符串资源数组创建的一个也是一样的 然而,显然,我们创建了旋转器,我们知道其中的一切是什么类型的。如果它来自资源,可能是字符串。如果以编程方式完成,则会出现某种类型的对象或可能的视图。但是,onItemSelected的签名如下所示: @Override public void o

如标题所示—

是否有任何方法可以确定从
中的微调器获得的项目类型(通常是
字符串,如果是从资源改编的,或者是通用
对象,如果是通过编程改编的,则是从
中选择的
?在本例中,我指的是在Java中以编程方式填充的,但据我所知,对于从字符串资源数组创建的一个也是一样的

然而,显然,我们创建了旋转器,我们知道其中的一切是什么类型的。如果它来自资源,可能是字符串。如果以编程方式完成,则会出现某种类型的
对象
或可能的
视图
。但是,
onItemSelected
的签名如下所示:

@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    // actions

    // to get the item, you would usually do something like:
    parent.getItemAtPosition(pos);
}
但我觉得这并不优雅。当然,至少在我给出的简单情况下(比如
Integer
)是有效的。它甚至可以用于处理多个不同类型的
微调器
,所有这些微调器都运行在同一个
侦听器上
——我实际上还没有尝试过

但似乎应该有一种方法让签名简单地像:

public void onItemSelected(AdapterView<Integer> parent, View view, int pos, long id)
public void已选择(AdapterView父视图、视图视图、整数位置、长id)
使用“instanceof”是确定“onItemSelected”中微调器返回的项目类型的唯一方法吗

这不是唯一的办法。但这可能是最好的办法

以下是一些备选方案:

if (itemSelected.getClass().getName().equals("java.lang.Integer")) {
     doSomeMath((Integer) itemSelected);
}

if (itemSelected.getClass() == Integer.class) {
     doSomeMath((Integer) itemSelected);
}

try {
    doSomeMath((Integer) itemSelected);
} catch (ClassCastException ex) {
    // squash
}
注:

  • 这些替代方案都不推荐。真的
  • instanceof
    操作符也测试子类,与前两个选项不同
  • 如果在
    doSomeMath
    方法中抛出
    ClassCastException
    ,则第三个版本也将挤压它
  • null出现问题
    instanceof
    运算符为
    null
    返回false,但所有这些选项都将抛出NPE

  • 不幸的是,你的替代方案行不通。
    AdapterView.OnItemSelectedListener接口声明该方法的第一个参数具有该类型。该接口不是通用的

    但似乎应该有办法得到签名[…]

    这似乎是因为
    AdapterView.getItemAtPosition(int)
    返回
    Object
    ,所以无法执行<代码>列表视图
    微调器
    不知道或不关心适配器包含的项目类型

    显然,但是,我们创建了微调器,我们知道其中的所有内容都是什么类型的

    确切地说,由于您是将哪些数据放入适配器的最终主人,因此您应该能够安全地强制转换这些数据

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
         final int item = (int) parent.getItemAtPosition(pos);
         doSomeMath(item);
    }
    
    @覆盖
    已选择公共位置(AdapterView父项、视图、整数位置、长id){
    final int item=(int)parent.getItemAtPosition(pos);
    doSomeMath(项目);
    }
    
    它不会检查“始终为真”的条件,而是在遇到意外数据时崩溃

    进入这种心态:如果发生了不应该发生的事情,代码应该抛出异常。这使您有机会修复任何错误,而不是永远不知道是否有任何错误

    另一种选择是将适配器存储在成员变量中,并从侦听器访问它

    private MyAdapter adapter;
    
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
         final int item = adapter.getItem(pos);
         doSomeMath(item);
    }
    
    private-MyAdapter;
    @凌驾
    已选择公共位置(AdapterView父项、视图、整数位置、长id){
    最终int项=适配器.getItem(pos);
    doSomeMath(项目);
    }
    

    这假设您的适配器覆盖
    getItem(int)
    并返回适当的类型。

    这里的目标是什么?是否要对多个微调器使用相同的
    OnItemSelectedListener
    ?不,不一定。只是想知道是否有比
    instanceof
    更好的方法来确定从微调器检索到的对象的类型。我认为没有。无论如何,我宁愿检查哪个微调器(
    parent.getId()
    )触发了
    onItemSelected
    调用,然后相应地执行操作,而不是根据项目的类型执行操作。如果由同一个侦听器处理多个微调器,那么这似乎是最好的方法。之后我也考虑过了。但无论如何,您通常需要知道类型才能对其执行操作,即使您确实知道它来自的确切微调器。是否可以扩展
    OnItemSelectedListener
    接口以创建具有特定类型的自定义版本的
    onItemSelected
    ?或者甚至将其扩展为通用版本?例如:
    GenericItemSelectedListener扩展了AdapterView.OnItemSelectedListener
    ,并选择了
    public void onItemSelected(AdapterView父项…
    ?如果其他参数类型也不同,则选择“是”。否则不会。但不清楚你会取得什么成就。您如何让android框架调用该方法?
    private MyAdapter adapter;
    
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
         final int item = adapter.getItem(pos);
         doSomeMath(item);
    }