繁体   English   中英

实现接口的解决方法包括<TIn extends T> , 带 X[] 类型参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM