Java 为什么投射对象是多余的

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

我有两个用于可扩展列表的构造函数,如下所示,我还有一个界面,如下所示。现在我想使用相同的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);
public MyExpandableList(Context-ctx、ActMain-ActMain、ArrayList-groupList){
this.mCtx=ctx;
this.mGroupList=组列表;
this.mBTUtils=新的BTUtils(ctx);
this.mDevDetailsObserver=(IDeviceDetailsPasser)actMain;//冗余强制转换,这是不必要的
}
公共MyExpandableList(上下文ctx、ActConnect、ActConnect、ArrayList组列表){
this.mCtx=ctx;
this.mGroupList=组列表;
this.mBTUtils=新的BTUtils(ctx);
this.mDevDetailsObserver=(IDeviceDetailsPasser)actConnect;//manadory casting
}
//接口
公共接口IDeviceDetailsPasser{
public void onDevicedetailsChosen(标题、详细信息、int GROUPPO);

}似乎
ActMain
已经实现了
IDeviceDetailsPasser
,这就是冗余强制转换的原因。

我认为在这种情况下,您的
ActMain
实现了
IDeviceDetailsPasser
,因此强制转换是冗余的,而
actConnect
没有实现
IDeviceDetailsPasser
,所以演员是强制性的

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

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

您是如何定义
ActMain
ActConnect
类的?@LetsamrIt似乎是
ActMain
实现了
idevicedtailspasser
提供了
ActMain
ActConnect
的定义,以及“mDevDetailsObserver”是如何声明的?@MikeM。我想我从Rahul Tiwari的评论中了解到,我的第一个活动实现了IDeviceDetailsPasser..我想你会说well@LetsamrIt你明白了。“所以强制转换是必需的。”而且可能会失败,出现
ClassCastException
。但谁知道呢。