如何将类型Class <! - ? - >转换为int

时间:2017-09-03 01:39:57

标签: java android types type-conversion indexoutofboundsexception

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

以下是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的类型需要在这里,因为我对配方类有其他用途 例如,稍后调用所有类的新实例,以使用一种方法调整所有类 我唯一能想到的是将类型Class转换为int,所以我可以调用返回索引号的方法,我可以做一些像食谱一样的事情。

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

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

错误显示为

  

IndexOutOfArrayException

1 个答案:

答案 0 :(得分:2)

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

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

然后,假设您的recipe实例有一个分配了Class<Activity>的字段,那么,您会想要这样的内容

 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<Recipe, Class<RecipeActivity>>结合使用,您可以使用map.get(Recipe.ChileConCarne)来获取相应的类元素,startActivity()可以使用