加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

传递给Java中的方法时,如何要求参数为两种类型

发布时间:2020-12-15 08:38:30 所属栏目:Java 来源:网络整理
导读:在一个类中,我必须调用另一个需要两个参数的类的构造函数,即IHelloServiceConnectionObserver和ContextWrapper.问题是他们都是这个. 注意:ContextWrapper是一个我无法控制的框架类(实际上是android.content.ContextWrapper).我的类(一个Android Activity)已
在一个类中,我必须调用另一个需要两个参数的类的构造函数,即IHelloServiceConnectionObserver和ContextWrapper.问题是他们都是这个.

注意:ContextWrapper是一个我无法控制的框架类(实际上是android.content.ContextWrapper).我的类(一个Android Activity)已经是一个ContextWrapper,我想把它混合一点IHelloServiceConnectionObserverness.

另请注意,我的类是几个都继承自ContextWrapper的类之一,因此组合ContextWrapper和IHelloServiceConnectionObserer将不起作用.

我能做到这一点:

HelloServiceConnection svc = HelloServiceConnection(this,this);

电话

public HelloServiceConnection(IHelloServiceConnectionObserver observer,ContextWrapper contextWrapper){
    this.observer = observer;
    this.contextWrapper = contextWrapper;
}

但这看起来很傻.或者我可以这样做:

HelloServiceConnection svc = HelloServiceConnection(this);

电话

public HelloServiceConnection(IHelloServiceConnectionObserver observer){
    this.observer = observer;
    this.contextWrapper = (ContextWrapper) observer;
}

但现在我将一个很好的编译时错误移动到运行时错误.

这里的最佳做法是什么?

编辑:嗯,我不能说这是一个“最佳实践”,但对于我的特殊情况,Jon Skeet有正确的答案.这是代码最终看起来像:

helloServiceConnection = HelloServiceConnection.create(this);

电话

public static <T extends ContextWrapper & IHelloServiceConnectionObserver> HelloServiceConnection create(T value){
    return new HelloServiceConnection(value,value);
}

反过来打电话

private HelloServiceConnection(IHelloServiceConnectionObserver observer,ContextWrapper contextWrapper){
    this.observer = observer;
    this.contextWrapper = contextWrapper;
}

因此,让我更多地说明为什么这是这种特殊情况的正确答案.由于ContextWrapper是我无法控制的框架的一部分,我无法改变它.因为它也是几个类的祖先,其中任何一个我可能想要使用HelloServiceConnection,所以扩展ContextWrapper的所有后代以在IHelloServiceConnectionObserver中添加它是没有意义的.

所以我以为我离开的时候别无选择,只有这个,这个偶像.一旦我理解了乔恩的回答,就可以节省一天的时间!

谢谢,乔恩 – 并感谢所有参与的人.

解决方法

好吧,你可以使调用通用:

public <T extends ContextWrapper & IHelloServiceConnectionObserver> void method
    (T item)

然后让类型推断对其进行排序.虽然它并不是非常令人愉快.

编辑:看起来你正在尝试使用构造函数,这将使它变得更难.您可以使用静态方法创建实例:

public static <T extends ContextWrapper & IHelloServiceConnectionObserver>
    HelloServiceConnection createConnection(T value)
{
    return new HelloServiceConnection(value,value);
}

private HelloServiceConnection(ContextWrapper wrapper,IHelloServiceConnectionObserver observer)
{
    this.wrapper = wrapper;
    this.observer = observer;
}

好的,所以构造函数和类型本身最终会有两个单独的字段 – 但我们知道它们都会引用同一个对象.如果你愿意,你甚至可以在构造函数中断言.

正如其他人所说,值得考虑的是你是否真的需要这种耦合.如果包装器和观察者不是同一个对象会发生什么坏事?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读