我正在尝试重构一个类和一组子类,其中M类型确实扩展了任何东西,即使我们知道它必须是某种类型的子类。该类型是参数化的,我希望它的参数化类型可用于已经具有M值的子类。
有没有办法定义这个类而不必在参数列表中包含冗余的K和V泛型类型。我希望能够让编译器从子类映射到的任何M中推断它们。
public abstract class NewParametrized<K, V, M extends SomeParametrized<K, V>> {
public void someMethodThatTakesKAndV(K k1, V v1) { }
}
换句话说,我希望类声明看起来像:
public class NewParametrized<M extends SomeParametrized<K, V>> {
K和V的类型将从M的定义中推断出来。
答案 0 :(得分:6)
问题是K
和V
并没有真正“重复”,至少不是变量声明,并且使用同一个变量是“重复”。
考虑这一点的方法是声明泛型类型K
和V
,然后在泛型类型M
的定义中使用那些声明的泛型类型。因此,您不要多次声明泛型类型K
或V
:相反,您只声明它们中的每一个,然后在其他内容的声明中引用它们。
从另一个角度来看,这里的泛型类型的数量仍然是三个,即K
,V
和M
。 M
恰好以K
和V
来定义,但您不必以此方式定义M
。
我应该补充一点,如果你是type inference的支持者,你可以查看声明和使用相同的变量作为不必要的重复。但是,如果您习惯于使用Java(或C或C ++,或许多其他语言)进行编程,那么您可能习惯于在使用它们之前声明变量。
答案 1 :(得分:2)
如果可能,声明
public class NewParametrized<M extends SomeParametrized<K, V>> {
如果在同一个包中定义了K或V类,那么将是不明确的,不可能知道它是一个类型变量还是对具体类的引用。