java - 传递给Java中的方法时如何要求参数是两种类型

标签 java

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

备注:ContextWrapper是一个我无法控制的框架类(实际上是 android.content.ContextWrapper)。我的类(class)(Android Activity)是-a ContextWrapper已经,我想加入一点 IHelloServiceConnectionObserver对它的内在。

另请注意,我的类是所有继承自 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成语。乔恩的回答,一旦我理解了,就挽救了这一天!

谢谢,乔恩 -- 并感谢所有参与的人。

最佳答案

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

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/

相关文章:

java - 如何在 spring boot 中禁用 Hazelcast 的默认关闭钩子(Hook)

java - 具有空属性实例化策略的深度 bean 复制

java - 注释不起作用

javascript - 差异时区浏览器和 Java

java - 如何将默认的snackbar动画更改为 "Top-to-button"?

java - 什么是 int ai = a[i], j;做?

java - 从子树的平衡性证明树是平衡的

java - 从 Activity 以外的类访问 Application 类

Java-如何使用 java printf 打印空日期的空白

java - 如何正确使用Java的Observable和Observer与JPA实体?