【问题标题】:Use the type parameter of the object in a default interface method在默认接口方法中使用对象的类型参数
【发布时间】:2015-07-22 15:02:51
【问题描述】:

我想将两个编解码器(下面的代码)组合在一起,因此它们必须具有兼容的类型才能组合在一起。该代码有效,但我必须使用Codec<F,T> c = this; 行才能使其工作,否则编译器似乎无法正确理解类型参数(以及对codec2 的限制)。我很高兴代码可以编译,但有没有更简洁的方法来实现这一点?

/**
 * Represents a coder-decoder from a format F to a format T
 */
public interface Codec <F,T> {
    T encode(F obj);
    F decode(T obj);

    /**
     * Compose two codecs with types <F,T> and <T,E> to a codec with type <F,E>.
     * @param codec2 The second codec
     * @return the new codec
     */
    public default <E> Codec<F,E> compose(Codec<T,E> codec2) {
        Codec<F,T> c = this;
        return new Codec<F,E>() {
            public E encode(F obj) { return codec2.encode(c.encode(obj)); }
            public F decode(E obj) { return c.decode(codec2.decode(obj)); }
        };
    }
}

【问题讨论】:

  • 你能添加什么不起作用吗?

标签: java generics interface java-8 type-parameter


【解决方案1】:

您正在声明一个实现Codec 接口的匿名内部类。

return new Codec<F,E>() {
    public E encode(F obj) { return codec2.encode(c.encode(obj)); }
    public F decode(E obj) { return c.decode(codec2.decode(obj)); }
};

在该匿名类声明的主体中,this 指的是该匿名内部类的实例,即。类型为Codec&lt;F, E&gt;

使用Codec.this 来引用封闭类的实例(本例中的接口)。

public E encode(F obj) {
    return codec2.encode(Codec.this.encode(obj));
}

public F decode(E obj) {
    return Codec.this.decode(codec2.decode(obj));
}

【讨论】:

  • 我完全忘记了this! (什么双关语)
猜你喜欢
  • 2017-10-12
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2017-12-01
  • 2019-01-28
  • 2018-08-28
相关资源
最近更新 更多