[英]Workarounds to implement interface including <TIn extends T>, with X[] type parameter
假设我们有一些这样的界面:
public interface Foo<T> {
<TIn extends T> void encode(TIn value)
T decode()
}
我在我的代码库中经常使用 Foo,但我希望添加TIn extends T
以使其更灵活,例如让Foo<Map<X>>
能够encode
HashMap<X>
或TreeMap<X>
。
这非常有效 - 直到我尝试实现Foo<T[]>
,它似乎无法实现,当public <TIn extends TItem[]> void encode(TIn array)
给出解析错误“ > expected
”时它击中括号[]
。 即使是 IntelliJ 在自愿实现接口时也什么都不做。
对于它的价值,如果 T 是其他一些具体的最终类型(例如 byte[]、Boolean 等),我似乎可以通过返回 T 来满足接口,所以它似乎在这里做了一些隐藏的智能修复。 所以看起来这只是T[]
的问题,它无法检测到T[]
是最终的。
有人对我如何解决这个问题有任何想法吗? 我真的不在乎TIn extends byte[]
只能满足TIn = byte[]
,我只想实现接口让编译器开心; 这样这个接口就可以在其他地方使用。
这些都没有意义。 你首先不需要那个TIn
:
public interface Foo<T> {
void encode(T value);
T decode;
}
class Example {
void test() {
Foo<HashMap<String, Integer>> foo = null;
foo.encode(new HashMap<String, Integer>());
}
}
这编译得很好。 一般来说,如果您声明一个仅在一个地方使用的新类型变量,那是没有意义的——类型变量只是javac
担心的事情,运行时不知道泛型(类型变量)是什么。 因此,除非它们用于链接提到类型的 2 个不同位置,否则使用它们没有多大意义,例如“编码方法的参数类型,解码()方法的返回类型? 我不在乎它是什么,但是,对于Foo
类型的任何给定用法,它都是一样的——那种“链接”)。
鉴于无需在encode
方法中引入额外的类型参数,因此无需尝试在那里声明新的类型 var。
仅在单个位置使用的 typevar 的通常替代方法是?
. <F> void foo(List<F> in)
和void foo(List<?> in)
之间没有功能区别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.