【问题标题】:Java Wildcard Capture with a Generic Interface使用通用接口捕获 Java 通配符
【发布时间】:2016-03-23 23:59:21
【问题描述】:

我有一个通用接口,我似乎无法为它制作一个通配符捕获助手,这让我发疯了。

我有一个界面:

public interface Foo<T extends Bar> {
  boolean isA(T t);
  T B();
}

它的实现是这样实例化的:

private Foo<? extends Bar> foo = new FooImpl();

这两个不能改变,显然我不能直接访问 FooImpl()。假设使用 FooImpl(),接口接受并返回 FooBar,它扩展了 Bar。

在我的代码中使用“foo”时出现编译问题:

if ( foo.isA(foo.B()) ){ //whatever }

其中 foo.B() 返回类型 FooBar。

我知道这是一个通配符捕获错误,需要一个助手,但我不知道如何设置。类中没有实例化 'foo' 的方法,其中 'foo' 是一个参数,这似乎是大多数帮助程序的编写方式。 'foo' 仅用于获取 FooBar 对象,以及测试 FooBar 对象。

非常感谢任何帮助,我希望我很清楚。谢谢!

【问题讨论】:

  • 你能贴出FooImpl的代码吗?所以我们肯定知道你创建了一个什么实例。

标签: java generics interface wildcard


【解决方案1】:

最简单的当然是在接口上为此添加一个方便的方法:

public interface Foo<T extends Bar> {
    boolean isA(T t);
    T B();

    default boolean bIsA() {
        return this.isA(this.B());
    }
}

无论如何,捕获方法只是一个带有类型参数的泛型方法:

static <T extends Bar> boolean bIsA(Foo<T> foo) {
    return foo.isA(foo.B());
}

没有比这更多的了。捕获助手的目的只是获取Foo&lt;T&gt; 并做我们需要的任何事情。

然后:

if ( Somewhere.bIsA(foo) ) {...}

【讨论】:

  • 啊,我想我知道该怎么做了。我知道我需要几个辅助方法,一个用于以这种方式调用接口的每个方法。我只需要你的回答让它点击我。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
相关资源
最近更新 更多