如何使用Java中的子类的Class实例对象将对象强制转换为自身的子类?

时间:2017-04-21 14:11:20

标签: java android class generics casting

假设我有一个抽象类AbstractFragment,它有一个超类Fragment

public abstract class AbstractFragment extends Fragment {
      public abstract updateData();



    public static <FragmentClass extends AbstractFragment>
    ChartClass newInstance(int condition, Class<ChartClass> chartFragmentClass) {

                Constructor<ChartClass> c = chartFragmentClass.getConstructor();

                ChartClass fragment = c.newInstance();

                Bundle args = new Bundle();

                args.putInt("key", condition);
                fragment.setArguments(args);

                return fragment;
    }

AbstractFragment班的两个孩子:

public class FirstChildFragment extends AbstractFragment {
          public updateData() {}
}

public class SecondChildFragment extends AbstractFragment {
              public updateData() {}
    }

在运行时,根据条件,我想根据条件将Fragment对象强制转换为第一个或第二个子节点之一,或者使用抽象类中的静态方法创建子节点的新实例(我已经有这样的静态方法,如下所示:

void onDataLoaded(int condition) {

        Fragment fragment = getChildFragmentManager()
                .findFragmentById(R.id.fragment_container_dashboard_chart);

        Class ChildFragmentClass;
        if (condition == 0) ChildFragmentClass = FirstChildFragment.class;
        else if (condition == 1) ChildFragmentClass = SecondChildFragment.class;
        else throw new RuntimeException("Condition is invalid");

        if (fragment.getClass().isInstance(ChildFragmentClass))
            ((ChildFragmentClass) fragment).updateData();
        else {
            ChildFragmentClass childFragment = ChildFragmentClass.newInstance(5, ChildFragmentClass);
        }
    }

上面代码中的问题是我不知道如何正确转换fragment对象,以便将其识别为ChildFragmentClass类的实例。随后,这意味着我尝试调用newInstance的代码也是正确的如何将片段适当地转换为ChildFragmentClass并能够调用适当的方法?我希望新实例成为第一个或第二个孩子的实例。

1 个答案:

答案 0 :(得分:1)

ChildFragmentClass不是一个类,它是一个局部变量。您应该创建一个新变量并分配它。

这可能对您的问题有所帮助。

if (fragment.getClass().isInstance(AbstractFragment))
    ((AbstractFragment) fragment).updateData();
else {
    Fragment childFragment = AbstractFragment.newInstance(5, ChildFragmentClass);
}