在一个类中,我必须调用另一个需要两个参数的类的构造函数,一个 IHelloServiceConnectionObserver
和一个 ContextWrapper
。问题是它们都是 this
。
注意: ContextWrapper
是一个我无法控制的框架类(实际上是 android.content.ContextWrapper
)。我的类(class)(一个 Android Activity
)已经是一个 ContextWrapper
,我想在其中混入一点 IHelloServiceConnectionObserver
ness。
另请注意,我的类是所有继承自 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
idom 之外我别无选择。乔恩的回答,一旦我理解了它,就拯救了这一天!谢谢,乔恩——感谢所有参与的人。
最佳答案
好吧,您可以使调用通用:
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/