java - 在默认接口(interface)方法中使用对象的类型参数

标签 java generics interface java-8 type-parameter

我想将两个编解码器(下面的代码)组合在一起,因此它们必须具有兼容的类型才能组合在一起。该代码有效,但我必须使用行 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)); }
        };
    }
}

最佳答案

您正在声明一个实现 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<F, E> .

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

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

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

关于java - 在默认接口(interface)方法中使用对象的类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31566959/

相关文章:

java - OpenGL 帧缓冲区渲染到纹理不工作

java - 无法为嵌套类型推断类型变量 T

java - 无法将通用项实例化为列表 Java

c++ - 在 C++ Vector 中存储从类模板继承的类

使用派生接口(interface)的 C# 接口(interface)实现

java - Gradle 无法解析 sikulixapi

java - Spring-Boot:同时处理多个请求

java - 使用泛型 <K> 减少重复代码?

java - 将 TYPE 注释传递给方法而不是标记接口(interface)

java - Linux 上的多个 Java webapps 总线程限制