Java / Android:通过方法返回类名

时间:2014-05-15 15:08:52

标签: java android class inheritance

我正在尝试创建一个基类fragmentstatepageradapter,我希望getItem方法返回一个新的片段实例,但我希望该片段具有任何可能的子类型。我认为它会是这样的,但它引发了一个错误:

@Override
public Fragment getItem( int position ) {

    if( mRosterUids == null || mRosterUids.size() <= position )
        return null;
    Log.e( "RosterDetailsPagerAdapter", "getItem(): " + mRosterUids.get(position) );
    return getItemClass().newInstance(mRosterUids.get(position));
}

public java.lang.Class<SLRosterDetailsFragment> getItemClass() {
    return SLRosterDetailsFragment.class;
}

错误消息来自newInstance中的mRosterUids.get(position),它说

“类中的newInstance()不能应用于(java.lang.String)”

并且不灵活的工作版本是:

@Override
public Fragment getItem( int position ) {

    if( mRosterUids == null || mRosterUids.size() <= position )
        return null;
    Log.e( "RosterDetailsPagerAdapter", "getItem(): " + mRosterUids.get(position) );
    return SLRosterDetailsFragment.newInstance(mRosterUids.get(position));
}

这是否可以使用,或者我应该让我的子函数覆盖getItem以返回自己的片段。

3 个答案:

答案 0 :(得分:0)

将getItemClass()更改为

public <T extends Object> T getItemClass() {
    return SLRosterDetailsFragment.class;
}

答案 1 :(得分:0)

在您的代码中,您间接执行:

return SLRosterDetailsFragment.class.newInstance(mRosterUids.get(position));

您从newInstance()派生的类java.lang.Class执行方法SLRosterDetailsFragment.class,并且是2个完全不同的对象。

在工作期间&#39;正在执行的版本:

return SLRosterDetailsFragment.newInstance(mRosterUids.get(position));

班级SLRosterDetailsFragment有一个名为newInstance

的方法

这是两种不同的方法......

答案 2 :(得分:-1)

感谢您的回答,伙计们。我在软件工程方面非常环保(初级开发,第一份工作),所以只是想看看我是否可以使我的适配器更具可扩展性,以后更容易使用。在阅读了评论并玩了一些东西后,我突然意识到有一个更简单的方法可以解决这个问题......

@Override
public Fragment getItem( int position ) {

    if( mRosterUids == null || mRosterUids.size() <= position )
        return null;
    Log.e( "RosterDetailsPagerAdapter", "getItem(): " + mRosterUids.get(position) );
    return getRosterDetailsFragment( mRosterUids.get(position) );
}

public SLRosterDetailsFragment getRosterDetailsFragment( String uid ) {
    return SLRosterDetailsFragment.newInstance( uid );
}

我确信我甚至可以将返回类型转换为Fragment,但是呃。谢谢大家!