在一个类中,我必须调用另一个需要两个参数的类的构造函数,一个 IHelloServiceConnectionObserver 和一个 ContextWrapper 。问题是它们都是 this

注意: ContextWrapper 是一个我无法控制的框架类(实际上是 android.content.ContextWrapper )。我的类(class)(一个 Android Activity )已经是一个 ContextWrapper,我想在其中混入一点 IHelloServiceConnectionObserver ness。

另请注意,我的类是所有继承自 ContextWrapper 的几个类之一,因此将 ContextWrapperIHelloServiceConnectionObserer 结合使用是行不通的。

我可以这样做:

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/

10-12 06:37