从扩展Generic中提取generics类型

我正在尝试重构一个类和一组子类,其中M类型确实扩展了任何东西,即使我们知道它必须是某种类型的子类。 该类型是参数化的,我希望它的参数化类型可用于已经具有M值的子类。

有没有办法定义这个类,而不必在参数列表中包含冗余的K和Vgenerics类型。 我希望能够让编译器从子类映射到的M中推断出它们。

public abstract class NewParametrized<K, V, M extends SomeParametrized> { public void someMethodThatTakesKAndV(K k1, V v1) { } } 

换句话说,我希望类声明看起来像:

  public class NewParametrized<M extends SomeParametrized> { 

K和V的类型将从M.的定义推断出来。

问题是KV并非真正“重复”,至少不是变量声明,并且使用同一变量是“重复”。

想到这一点的方法是声明generics类型KV ,然后在generics类型M的定义中使用那些声明的generics类型。 因此,您不要多次声明generics类型KV :而是将它们中的每一个声明一次,然后在其他内容的声明中引用它们。

换句话说,这里的generics类型的数量仍然是三个,即KVM M恰好用KV来定义,但你不必那样定义M


我应该补充一点,如果你是类型推断的支持者,你可以查看声明和使用相同的变量作为不必要的重复。 但是,如果您习惯于使用Java(或C,或C ++,或许多其他语言)进行编程,那么您可能习惯于在使用它们之前声明变量。

如果有可能,宣言

 public class NewParametrized> { 

如果在同一个包中定义了K或V类,那将是不明确的,不可能知道它是一个类型变量还是对具体类的引用。