【问题标题】:Java/Android: Return a class name through a methodJava/Android:通过方法返回类名
【发布时间】:2014-05-15 15:08:52
【问题描述】:

我正在尝试创建一个基类 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),它说

“Class中的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 以返回它们自己的片段。

【问题讨论】:

  • 第一个解决方案闻起来像是不必要的 hack 恕我直言,更不用说反射很慢,从长远来看可能会影响您的用户体验。
  • 这只是一个猜测,但 Java String 类是不可变的,这可以解释错误。您是否在其他课程上尝试过此代码?可变和不可变?

标签: java android class inheritance


【解决方案1】:

将您的 getItemClass() 更改为

公共 T getItemClass() { 返回 SLRosterDetailsFragment.class; }

【讨论】:

    【解决方案2】:

    在你的代码中你是间接执行的:

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

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

    在“工作”版本中它正在执行:

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

    SLRosterDetailsFragment 类有一个名为newInstance 的方法

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

    【讨论】:

      【解决方案3】:

      谢谢大家的回答。我在软件工程(初级开发人员,第一份工作)方面非常新手,所以只是在玩这个想法,看看我是否可以让我的适配器更具可扩展性并且以后更容易使用。在阅读了 cmets 并玩了一些东西之后,我突然想到有一个更简单的方法可以解决这个问题......

      @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,但是嗯。谢谢大家!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-27
        • 2015-07-20
        • 2012-06-13
        • 1970-01-01
        • 2019-03-29
        • 2018-04-05
        • 1970-01-01
        相关资源
        最近更新 更多