我试图理解为什么Java不允许像在通用方法中那样在通用类中使用隐式类型。
我已经在网上搜索了有关此问题的答案,但是还没有遇到为什么 Java不支持以下内容的原因:
// This will not compile:
public <T> interface ElementPicker<L extends List<T>> { ... }
// This on the other hand will
public interface ElementPicker<T, L extends List<T>> { ... }
因此,我们必须在类通用参数中明确提及类型T。当然,这意味着我们现在必须始终编写:
ElementPicker<Integer, List<Integer>>
// instead of just:
ElementPicker<List<Integer>>
这会导致我的代码不断出现头痛,在这种情况下,我试图明智地使用泛型进行平衡,同时使我的类型可读且简短。
不幸的是,在我当前的项目中,我正在处理一堆嵌套的泛型类型,它们的类型实参冒泡到顶部,因此我有很长的顶层类,其中必须包含所有泛型类型数据。
要了解这如何成为问题,请考虑:
interface ScalarValue<T extends Number> {
T toNumber();
}
interface ScalarAdder<T, U extends ScalarValue<T>> {
T add(U v1, U v2);
}
class ScalarAccumulator<T, U extends ScalarValue<T>,
A extends ScalarAdder<T, U>> {
...
}
// Assuming we have these implementations:
class RationalValue implements ScalarValue<Float> { .. }
class RationalAdder implements ScalarAdder<Float, RationalValue> { .. }
// A typical type could look like this monster:
ScalarAccumulator<Float, RationalValue, RationalAdder>
// Whereas an implicit declaration like this:
public <T extends Number,
U extends ScalarValue<T>,
A extends ScalarAdder<T, U>
class ScalarAccumulator<A> { ... }
// ... would allow us to simply write
ScalarAccumulator<RationalAdder>
// ...as all other types can be inferred.
同样,这是一个例子,但是我在工作中经常遇到这类事情。我还没有找到为什么这不可能的原因。方法就可以了(从单个值及其类推断类型)。
那么,为什么Java可以在方法中而不是在类中支持它呢?我想不出一个示例,在该示例中,一个类不显式地包含类型是一个问题。但是我可能缺少一些东西。
如果有人对解决此类情况有任何好的建议,我也将不胜感激。
答案 0 :(得分:1)
在Java 10中,您可以使用var
来跳过类型声明。这是一种将其与类型推断结合使用的方式(有点怪癖),因此您可以创建实例而无需声明所有嵌套类型:
static <T, U extends ScalarValue<T>, A extends ScalarAdder<T, U>> ScalarAccumulator<T, U, A> create(Class<A> adderClass) {
return new ScalarAccumulator<>();
}
static void test() {
var a = create(RationalAdder.class);
}