从类泛型中创建新的特定对象

时间:2013-07-02 16:01:03

标签: java android class generics

好的,所以我做了一些环顾四周,我想我可能会犯这个错误。我上大学的C ++课程作为选修课,我喜欢修补,但我还在学习Java。

所以我使用ListAdapter来放置用户可以选择的不同片段的列表,然后他们选择的片段就位于ListAdapter所在的位置。它只需要数组,没有大问题。

/**
 * An array of POJOs used to hold the info about the fragments we'll be
 * swapping between This should be inserted into an array adapter of some
 * sort before being passed onto ListAdapter
 */
private static final FragmentDetails[] FRAGMENT_DETAILS = {
        new FragmentDetails(R.string.action_extraInfo,
                R.string.extraInfo_description,
                ExtraInfoFragment.class),
        new FragmentDetails(R.string.action_largeTach,
                R.string.largeTach_description, 
                LargeTachFragment.class),
                ...
            };
/**
 * @author PyleC1
 * 
 *         A POJO that holds a class object and its resource info
 */
public static class FragmentDetails {
    private final Class<? extends Fragment> fragmentClass;
    private int titleId;
    private int descriptionId;
/**
     * @param titleId
     *            The resource ID of the string for the title
     * @param descriptionId
     *            The resource ID of the string for the description
     * @param fragmentClass
     *            The fragment's class associated with this list position
     */
    FragmentDetails(int titleId, int descriptionId,
            Class<? extends Fragment> fragmentClass) {
            super();
        this.titleId = titleId;
        this.descriptionId = descriptionId;
        this.fragmentClass = fragmentClass;
    }

    ...
}

无论如何,我通过一个名为CustomArrayAdapter的简单get / set类运行它,并在附加片段时将其发送到ListAdapter。

public void onAttach(Activity activity) {
    super.onAttach(activity);

    ListAdapter listAdapter = new CustomArrayAdapter(getActivity(),
        FRAGMENT_DETAILS);
    setListAdapter(listAdapter);

}

到目前为止一切顺利。当我尝试编写onListItemClick侦听器时,问题出现了。我似乎找不到从类信息中创建真实对象的方法。我环顾四周,发现.getClass()。newInstance()函数应该与new大致相似,所以我试过了。

public void onListItemClick(ListView l, View v, int position, long id) {
    FragmentDetails details = (FragmentDetails) getListAdapter().getItem(position);

        FragmentManager fragmentManager = ...
        FragmentTransaction fragmentTransaction = ...

        fragmentTransaction.add(R.id.fragment_container, 
                                details.fragmentClass.newInstance());
}

这样做会在编译器中抛出非法访问异常。我知道类似的东西在C ++中是可以接受的。类指针可能吗?但这可能是Java中完全错误的方式。也许不是类型安全?

我唯一的另一个想法是删除

Class<? extends Fragment> fragmentClass
来自数组的

泛型,只是使用switch语句(或许来自标题id)来硬编码片段事务,尽管这似乎有点不优雅。如果你想发布新的活动,它可以正常工作,你可以将泛型类传递给这样的意图:

Class<? extends Foo> bar = someFooClass.getClass();
new Intent(this, bar);

但片段不接受这个。

1 个答案:

答案 0 :(得分:1)

根据documentation

IllegalAccessException - if the class or its nullary constructor is not accessible.

因此,如果要使用反射实例化片段,则所有可能的类<? extends Fragment>都需要提供public无参数构造函数。