在默认接口方法中使用对象的类型参数
Use the type parameter of the object in a default interface method
我想将两个编解码器(下面的代码)组合在一起,因此它们必须具有兼容的类型才能组合在一起。该代码有效,但我必须使用 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
接口的匿名内部 class。
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)); }
};
在那个匿名 class 声明的正文中,this
指的是这个匿名内部 class 的实例,即。类型 Codec<F, E>
.
使用 Codec.this
引用封闭 class 的实例(在本例中为接口)。
public E encode(F obj) {
return codec2.encode(Codec.this.encode(obj));
}
public F decode(E obj) {
return Codec.this.decode(codec2.decode(obj));
}
我想将两个编解码器(下面的代码)组合在一起,因此它们必须具有兼容的类型才能组合在一起。该代码有效,但我必须使用 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
接口的匿名内部 class。
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)); }
};
在那个匿名 class 声明的正文中,this
指的是这个匿名内部 class 的实例,即。类型 Codec<F, E>
.
使用 Codec.this
引用封闭 class 的实例(在本例中为接口)。
public E encode(F obj) {
return codec2.encode(Codec.this.encode(obj));
}
public F decode(E obj) {
return Codec.this.decode(codec2.decode(obj));
}