Java 方法参数,该参数可能是N个接口的实现

Java 方法参数,该参数可能是N个接口的实现,java,java-8,Java,Java 8,Java中有没有一种使用泛型的方法可以让我指定一个实现接口a或B的方法参数 public void foo(Object bar) // bar could either be an implementation of interface A or interface B but nothing else. private interface A<T> { Object work(final Fizz fizz, final T t); } private interfa

Java中有没有一种使用泛型的方法可以让我指定一个实现接口a或B的方法参数

public void foo(Object bar) // bar could either be an implementation of interface A or interface B but nothing else.

private interface A<T>
{
    Object work(final Fizz fizz, final T t);
}

private interface B
{
    Object work(final Fizz fizz);
}
public void foo(Object bar)//bar可以是接口A或接口B的实现,但不能是其他实现。
专用接口A
{
目标作品(最终嘶嘶嘶嘶、最终T T);
}
专用接口B
{
目标作品(最终气泡);
}

否;由于
A
B
之间没有隐含的关系,除了一个
work
方法的同时实现(并且有不同的启动签名),因此您唯一的方法就是重载该方法

public void foo(A<?> bar) { }

public void foo(B bar) { }
public void foo(A bar){
公开无效foo(B bar){}

否;由于
A
B
之间没有隐含的关系,除了一个
work
方法的同时实现(并且有不同的启动签名),因此您唯一的方法就是重载该方法

public void foo(A<?> bar) { }

public void foo(B bar) { }
public void foo(A bar){
公开无效foo(B bar){}

一般意义上没有真正的解决方案,但对于您的特定示例,您可以尝试以下方法:

public <T> void foo(A<T> bar) {
    // ...
}

private interface A<T> {
    Object work(final Fizz fizz, final T t);
}

private interface B extends A<Void> {

    default Object work(final Fizz fizz) {
        return work(fizz, null);
    }

    Object work(final Fizz fizz, final Void ignoreMe);
}
public void foo(一个条){
// ...
}
专用接口A{
目标作品(最终嘶嘶嘶嘶、最终T T);
}
专用接口B扩展了{
默认对象工作(最终嘶嘶嘶嘶){
返回工作(嘶嘶作响,空);
}
目标作品(最终嘶嘶嘶嘶、最终无效忽略);
}

一般意义上没有真正的解决方案,但对于您的特定示例,您可以尝试以下方法:

public <T> void foo(A<T> bar) {
    // ...
}

private interface A<T> {
    Object work(final Fizz fizz, final T t);
}

private interface B extends A<Void> {

    default Object work(final Fizz fizz) {
        return work(fizz, null);
    }

    Object work(final Fizz fizz, final Void ignoreMe);
}
public void foo(一个条){
// ...
}
专用接口A{
目标作品(最终嘶嘶嘶嘶、最终T T);
}
专用接口B扩展了{
默认对象工作(最终嘶嘶嘶嘶){
返回工作(嘶嘶作响,空);
}
目标作品(最终嘶嘶嘶嘶、最终无效忽略);
}

A
还是
B
以任何方式相互关联?@Makoto A和B在逻辑上是相关的,因为B与A几乎相同,只是它的工作签名中只有一个fizz对象。
work
的调用者如何知道它是否应该传递一个
T
参数?是
A
还是
B
以任何方式相互关联?@Makoto A和B是逻辑关联的,因为B与A几乎相同,只是它的工作签名中只有一个fizz对象。
work
的调用方如何知道它是否应该传递一个
T
参数?请注意,在这两种情况下,像
void foo(A bar)
这样的签名并不比
void foo(A bar)
好,
foo
的实现不知道
T
的实际类型,也不能为
A.work
的第二个参数提供任何兼容的参数,除了
null
。请注意,在这两种情况下,像
void foo(A bar)
这样的签名并不比
void foo(A bar)
更好,
foo
的实现不知道
T
的实际类型,并且除了
null
之外,不能为
A.work
的第二个参数提供任何兼容的参数。