有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么强制转换对象是多余的

我有两个用于可扩展列表的构造函数,如下所示,我还有一个界面,如下所示。现在我想使用相同的expandlist适配器 两个不同的活动这就是为什么我创建了两个构造函数。但是问题是初始化构造函数的时候,正如你在第一个构造函数中看到的,当我 初始化接口对象到构造函数中的第二个参数,我收到“冗余强制转换”,而在第二个构造函数中,必须初始化 接口对象指向第二个参数,该参数表示应实现该接口的活动

请解释为什么第一个构造器中的施法是rundant,而第二个构造器中的施法是manadory

更新

both activities extends AppCompatActivity

*代码

public MyExpandableList(Context ctx, ActMain actMain, ArrayList<Group> groupList) {
    this.mCtx = ctx;
    this.mGroupList = groupList;
    this.mBTUtils = new BTUtils(ctx);
    this.mDevDetailsObserver =  (IDeviceDetailsPasser) actMain;//redundant casting, which is not necessary
}

public MyExpandableList(Context ctx, ActConnect actConnect, ArrayList<Group> groupList) {
    this.mCtx = ctx;
    this.mGroupList = groupList;
    this.mBTUtils = new BTUtils(ctx);
    this.mDevDetailsObserver = (IDeviceDetailsPasser) actConnect;//manadory casting

}

//interface
public interface IDeviceDetailsPasser {
public void onDevicedetailsChosen(Header header, Details details, int groupPos);

}


共 (2) 个答案

  1. # 1 楼答案

    我认为在这种情况下,您的actMain实现了IDeviceDetailsPasser,因此强制转换是多余的,而您的actConnect没有实现IDeviceDetailsPasser,因此强制转换是必需的

    编辑: 要处理ClassCastException,请使用try/catch

        try {
            mDevDetailsObserver = (IDeviceDetailsPasser) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement IDeviceDetailsPasser");
        }
    
  2. # 2 楼答案

    看起来ActMain已经实现了IDeviceDetailsPasser,这就是冗余强制转换的原因