[英]Generic that Extends a Generic, Passing Down Type
如果这个问题是重复的,请原谅我,我只是不知道如何用谷歌搜索来找到答案。
首先,我有一个名为AsyncRoutine<Msg>
的抽象类,它是通用的,并指定了某种Msg
类型。
接下来,我有一个抽象的AsyncMessageProvider<T extends AsyncRoutine>
,旨在将Msg
传递到AsyncRoutine
。
假设我创建了一个扩展AsyncRoutine
的子类MyAsyncRoutine<Integer>
。 我想创建一个支持此类的AsyncMessageProvider
,因此我将对其进行子类化, MyAsyncMessageProvider<MyAsyncRoutine>
使MyAsyncRoutine
成为其通用类型。
在MyAsyncMessageProvider
,我有一个方法message(...)
被调用来传递一个Msg
,在这种情况下是一个Integer
。
public class MyAsyncMessageProvider extends AsyncMessageProvider<MyAsyncRoutine> {
protected void message(Msg msg) { // compile error, doesn't know what 'Msg' is
}
}
如何在AsyncMessageProvider
访问MyAsyncRoutine
( Integer
) 的通用类型? 我基本上想让message(...)
函数锁定我在 <> 中指定的任何内容,因为我正在AsyncMessageProvider
是否可以在没有反思的情况下做到这一点? 或者有没有更好的方法来做到这一点? 如果可能,我想避免使用反射。
最小可行示例
抽象类定义:
public abstract class AsyncRoutine<Msg> {
// Implementation not important
}
public abstract class AsyncMessageProvider<Routine extends AsyncRoutine<Msg>> { // Compile error, cannot resolve Msg
abstract void messageRoutine(Msg m);
}
AsyncMessageProvider
使用Msg
以便它匹配来自“ AsyncRoutine<Msg>
”的通用Msg
,我将其子类AsyncRoutine<Msg>
AsyncMessageProvider
?为它的子类添加一个类型:
public abstract class AsyncMessageProvider<Msg, Routine extends AsyncRoutine<Msg>> {
abstract void messageRoutine(Msg m);
}
——
虽然这会编译,但使用单个字母作为类型名称是惯例,即:
public abstract class AsyncMessageProvider<T, Routine extends AsyncRoutine<T>> {
abstract void messageRoutine(T t);
}
这样做可以让读者清楚类型是什么,因为他们习惯于看到单个字母的名字。 有人读这个:
abstract void messageRoutine(Msg m);
如果他们认为该方法需要一个名为Msg
的类的实例,则可以原谅。
当您实际上有一个名为Msg
的类时,问题会变得更糟,因为同名的类型隐藏了相应的类,这会让您的同事感到难过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.