【问题标题】:How to convert type Class<?> to int如何将类型 Class<?> 转换为 int
【发布时间】:2018-02-11 15:50:10
【问题描述】:

我正在尝试转换此数据类型,以便稍后在另一个类中调用该方法,以通过具有@987654323 字段的类的索引号来切换在其他方法中进行的布局,例如recipe1Layout(); @数组。

这里是getItem()方法

public int getItem(){
     int index = 0;
     for(int i = 0; i < 100; i++) {
         try{
           index = recipe.getClass().getField("Classes").get(i);
         } catch(Exception e){

         }
     }
     return index;
 }

这是配方类

    public class Recipes {
      public Class<?>[] Classes = {
        ChileConLecheActivity.class,
        ArrozActivity.class,
        EnchiladasActivity.class,
        SopaActivity.class
      };
    }

Class 的类型需要在这里,因为我对 recipe 类还有其他用途。
例如,创建一个所有类的新实例,以便稍后调用以使用一种方法对所有类进行调整。
我唯一能想到的就是将类型 Class 转换为 int,这样我就可以调用返回索引号的方法,我可以执行类似配方的操作。

    index = Integer.parseInt(Classes[I].getName().toString());

但这是我寻求帮助的地方,我不知道如何摆脱 logcat 中的错误。

错误显示为

IndexOutOfArrayException

【问题讨论】:

  • int 是一个原语。你需要转换成Integer.class,也就是Class&lt;?&gt;
  • 您的错误是I &gt;= Classes.length,但您没有向我们展示I 的分配对象。而Integer.parseInt() 将无法解析"ChileConLecheActivity",所以你的问题没有意义......
  • 您是在问如何在类数组中找到特定类的索引?
  • 同意 cricket_007。这有 XY 问题的迹象。您正在尝试执行任务 X,并且您已经找到了一个虚假的解决方案 Y。Y 不起作用(因为它是虚假的)但是由于您没有解释任务 X,我们无法告诉您什么 Z(真正的解决方案) 可能是。 meta.stackexchange.com/questions/66377/what-is-the-xy-problem
  • 您可以尝试使用HashMap&lt;Class&lt;?&gt;,Integer&gt; 代替数组。

标签: java android types type-conversion indexoutofboundsexception


【解决方案1】:

首先,停止使用反射。使用公共静态数组。

public class Recipes {
  public static final Class<?>[] CLASSES = {
    ChileConLecheActivity.class,
    ArrozActivity.class,
    EnchiladasActivity.class,
    SopaActivity.class
  };
}

然后,假设您的 recipe 实例具有分配给它的 Class&lt;Activity&gt; 的字段,那么您会想要这样的东西

 public int getItem(){
     int index = -1;
     for(int i = 0 ; i < Recipe.CLASSES.length; i++) {
        if (recipe.getActivityClass().equals(Recipe.CLASSES[i]) { 
           index = i;
           break; 
        } 
     }
     return index;
 }

但是,在某些情况下,将一个 Activity 类耦合到任何单个 Recipe 实例可能不是一个好主意。

我正在尝试转换此数据类型,以便稍后在另一个类中调用该方法,以切换在其他方法中进行的布局

如果我了解您要做什么,您需要一些映射结构到某些具有一些预定义布局的类。

一般来说,这可以通过枚举和 OOP 模式来完成

有一些像这样的基类

public interface Layoutable {
    int getLayout();
}

public enum Recipe {
    ChileConLeche(R.layout.chile_con_leche),
    Arroz(R.layout.arroz),
    Enchiladas(R.layout.enchiladas),
    Sopa(R.layout.sopa)

    int layout;
    Recipe(int layout) { this.layout = layout };
}

理想情况下,您会希望使用 Fragments,但这里是 Activity 结构的示例

public abstract class RecipeActvity extends AppCompatActivity implements Layoutable {
    protected Recipe recipe;
    protected int getLayout() { return recipe.layout; }
}

public class ChileConLecheActivity extends RecipeActvity {
    public ChileConLecheActivity() {
        this.recipe = Recipe.ChileConLeche;
    }

    @Override
    public void onCreate(...) {
        setContentView(getLayout());
    }
}

您还可以将其与Map&lt;Recipe, Class&lt;RecipeActivity&gt;&gt; 结合使用,您可以从中使用map.get(Recipe.ChileConCarne) 来获取相应的类元素,您可以使用startActivity() 来获取相应的类元素

【讨论】:

  • 谢谢你,但我只是想弄清楚如何将 Class 转换为 int 但非常好的代码。或者@Dawood ibn Kareem 如何提到如何从类数组中获取索引或者:) 谢谢你
  • 那么你的问题是你必须有一些断点说if (classX == classYouWantToFind) return index; ...这是循环数组以获取索引的唯一方法。正如我们都指出的那样,您真的不想要一系列类。 Enums+Switch 案例会更好。 HashMap 的性能甚至更高。
  • 好的,谢谢你的建议@cricket_007 :) 谢谢大家
  • 我继续使用 hashmap
  • 工作得非常好
猜你喜欢
  • 2016-03-12
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
相关资源
最近更新 更多