【发布时间】:2020-01-13 11:18:36
【问题描述】:
如下所述(我可能对自己的解释很糟糕):
我想了解这个问题背后的原理,以便将这些知识应用到真正的问题中。
问题开始
我正在一个系统中工作,该系统旨在成为一个可供许多子系统使用的抽象库。这个想法是有一个可以通过实现扩展的标准行为。 我的问题是 java 编译器无法推断方法参数类型,即使它没有任何意义,因为边界在每个相关的泛型类/方法上都设置得很好。
下面有一个例子,是重现问题的最小例子。我知道在这个例子中看起来有点傻,但那是因为简化了:
public class Test {
public static void main(String[] args) {
Gen<? extends Base> gen = new HijaGen();
gen.applyTo(Hija.EXAMPLE);
}
private interface Base {
String getName();
}
private enum Hija implements Base {
EXAMPLE;
@Override
public String getName() {
return this.name();
}
}
private interface Gen<T extends Base> {
boolean applyTo(T base);
}
private static class HijaGen implements Gen<Hija> {
@Override
public boolean applyTo(Hija base) {
return false;
}
}
}
基本上它说 applyTo 期望 Base 和 Hija 的子类是无效的,在我看来这没有任何意义。
提前致谢。
编辑:
此代码用于库,因此解决方案无法指定类型,此后无法通过特定实现进行扩展。
我已经知道,如果我指定泛型类型而不是抛出类型通配符,它将完美地工作。但我的问题是,即使 Hija 是 Base 的子类,而且方法公司需要 Base 的子类,它怎么可能永远不会编译......
我想了解这个问题背后的原理,以便我可以将这些知识应用到真正的问题中。
【问题讨论】:
-
声明“此代码用于库”并没有真正的帮助。了解应该如何访问库很重要。您提供的
main方法是一个示例调用,但不是您期望需要库的方法。客户在使用 lib 时会关心哪些变量类型是相关问题。 -
@daniu 我认为你专注于一些不重要的事情。具体问题是:即使 Hija 满足(至少在理论上)公司要求的方法,这种方法怎么可能不接受 Hija?关于图书馆的提及只是为了澄清为什么我不能只使用 Gen
这是快速解决方案 -
好吧,您标记为已接受的答案包含我的评论所要表达的内容,即可能需要更改对库的调用。
标签: java generics type-inference generic-programming