Extract Generic types from extended Generic

不羁的心 提交于 2019-12-17 20:27:15

问题


I'm trying to refactor a class and set of subclasses where the M type does extend anything, even though we know it has to be a subclass of a certain type. That type is parametrized and I would like its parametrized types to be available to subclasses that already have values for M.

Is there any way to define this class without having to include the redundant K and V generic types in the parameter list. I'd like to be able to have the compiler infer them from whatever M is mapped to by subclasses.

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

    public void someMethodThatTakesKAndV(K k1, V v1) { }
}

In other words, I'd like the class declaration to look something like:

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

And K and V's types would be inferred from the definition of M.


回答1:


The problem is that K and V aren't really "repeated", at least not any more than a variable declaration and a use of that same variable are "repetition".

The way to think of this is that you declare the generic types K and V, and then you use those declared generic types in the definition of the generic type M. So, you don't declare the generic type K or V more than once: Rather, you declare each of them once and then refer to them in a declaration of something else.

To look at it another way, the number of generic types here is still three, namely K, V, and M. M happens to be defined in terms of K and V, but you didn't have to define M that way.


I should add that if you are a proponent of type inference, you might view the declaration and the use of the same variable as unnecessary repetition. However, if you're accustomed to programming in Java (or C, or C++, or many, many other languages), then you're probably accustomed to declaring variables before you use them.




回答2:


If it were possible, the declaration

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

would be ambiguous if a K or V class were defined in the same package, it would be impossible to know whether it is a type variable or a reference to the concrete class.



来源:https://stackoverflow.com/questions/2382912/extract-generic-types-from-extended-generic

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!