在一个类中,我必须调用另一个需要两个参数的类的构造函数,一个 IHelloServiceConnectionObserver
和一个 ContextWrapper
.问题是他们都是this
.
备注:ContextWrapper
是一个我无法控制的框架类(实际上是 android.content.ContextWrapper
)。我的类(class)(Android Activity
)是-a ContextWrapper
已经,我想加入一点 IHelloServiceConnectionObserver
对它的内在。
另请注意,我的类是所有继承自 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
.
所以我想我别无选择,只能this,this
成语。乔恩的回答,一旦我理解了,就挽救了这一天!
谢谢,乔恩 -- 并感谢所有参与的人。
最佳答案
好吧,您可以使调用通用:
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;
}
好的,所以构造函数和类型本身将以两个单独的字段结束 - 但我们知道它们都将引用同一个对象。如果愿意,您甚至可以在构造函数中断言。
不过正如其他人所说,值得考虑您是否真的、真的需要这种耦合。如果包装器和观察者不是同一个对象,会发生什么坏事?
关于java - 传递给Java中的方法时如何要求参数是两种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5114279/