传递给Java中的方法时,如何要求参数为两种类型
在一个类中,我必须调用另一个需要两个参数的类的构造函数,即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; } 好的,所以构造函数和类型本身最终会有两个单独的字段 – 但我们知道它们都会引用同一个对象.如果你愿意,你甚至可以在构造函数中断言. 正如其他人所说,值得考虑的是你是否真的需要这种耦合.如果包装器和观察者不是同一个对象会发生什么坏事? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |