作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试重构一个类和一组子类,其中 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 的定义中推断出来。
最佳答案
问题是 K
和 V
并不是真正的“重复”,至少不会比变量声明和使用同一个变量“重复”重复”。
思考的方式是声明泛型类型 K
和 V
,然后在泛型类型的定义中使用那些声明的泛型类型 M
。因此,您不会多次声明泛型类型 K
或 V
:相反,您对它们分别声明一次,然后在其他内容的声明中引用它们.
换个角度来看,这里泛型的数量还是三个,分别是K
、V
、M
。 M
恰好是根据 K
和 V
定义的,但您不必定义 M
方式。
我应该补充一点,如果你是 type inference 的支持者,您可能会将同一变量的声明和使用视为不必要的重复。但是,如果您习惯于使用 Java(或 C、C++,或许多其他语言)进行编程,那么您可能习惯于在使用变量之前声明变量。
关于java - 从扩展泛型中提取泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2382912/
我是一名优秀的程序员,十分优秀!