从扩展Generic中提取泛型类型

Bri*_*ham 3 java generics

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

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

public abstract class NewParametrized<K, V, M extends SomeParametrized<K, V>> {

    public void someMethodThatTakesKAndV(K k1, V v1) { }
}
Run Code Online (Sandbox Code Playgroud)

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

 public class NewParametrized<M extends SomeParametrized<K, V>> {
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*han 6

问题在于K并且V并非真正"重复",至少不是变量声明,并且使用同一变量是"重复".

想到这一点的方式是,你声明泛型类型KV,然后在泛型类型的定义中使用这些声明的泛型类型M.因此,您不要声明泛型类型KV多次:相反,您只声明它们中的每一个,然后在其他声明中引用它们.

换句话说K,这里的泛型类型的数量仍然是三个,即VM. M恰好在来定义KV,但是你没有定义M的方式.


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