Java 从扩展泛型中提取泛型类型

Java 从扩展泛型中提取泛型类型,java,generics,Java,Generics,我试图重构一个类和一组子类,其中m类型确实扩展了任何东西,尽管我们知道它必须是某个类型的子类。该类型是参数化的,我希望它的参数化类型对已经有M值的子类可用 是否有任何方法可以定义此类,而不必在参数列表中包含冗余的K和V泛型类型。我希望编译器能够从子类映射到的M中推断出它们 public abstract class NewParametrized<K, V, M extends SomeParametrized<K, V>> { public void some

我试图重构一个类和一组子类,其中m类型确实扩展了任何东西,尽管我们知道它必须是某个类型的子类。该类型是参数化的,我希望它的参数化类型对已经有M值的子类可用

是否有任何方法可以定义此类,而不必在参数列表中包含冗余的K和V泛型类型。我希望编译器能够从子类映射到的M中推断出它们

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

    public void someMethodThatTakesKAndV(K k1, V v1) { }
}
公共抽象类newParameterized{
public-void-somemethods采用skandv(kk1,vv1){}
}
换句话说,我希望类声明看起来像:

 public class NewParametrized<M extends SomeParametrized<K, V>> {
公共类新参数化{

而K和V的类型可以从M的定义中推断出来。

问题是
K
V
并不是真正的“重复”,至少不比变量声明和使用同一变量更为“重复”

考虑这一点的方法是,您声明泛型类型
K
V
,然后在泛型类型
M
的定义中使用这些已声明的泛型类型。因此,您不会多次声明泛型类型
K
V
:而是将它们声明一次,然后引用他们在声明其他事情

从另一个角度来看,这里的泛型类型的数量仍然是三个,即
K
V
,和
M
M
碰巧是根据
K
V
来定义的,但您不必这样定义
M



<>我应该补充一下,如果你是一个支持者,你可能会看到声明和使用相同的变量作为不必要的重复。但是,如果你习惯于用java(或C或C++,或许多其他许多语言)编程,那么您可能习惯于在使用变量之前声明它们。

如果可能,声明

public class NewParametrized<M extends SomeParametrized<K, V>> {
公共类新参数化{

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

我认为他主要指的是使用该类时的重复,而不仅仅是其声明中的重复。每次引用该类的实例时,都必须重复相同。如
newParameterized
。两个字符串/整数出现都是用法,而不是声明。好的一点-我没有从类用户的角度考虑它,只是从作者的角度考虑。这种冗长是不幸的,即使它在类声明的上下文中是有意义的。