Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型扩展泛型传递类型的泛型_Java - Fatal编程技术网

Java 泛型扩展泛型传递类型的泛型

Java 泛型扩展泛型传递类型的泛型,java,Java,如果这个问题是重复的,请原谅,我只是不知道如何用谷歌搜索来给出答案 首先,我有一个名为AsyncRoutine的抽象类,它是泛型的,并指定某种类型的Msg类型 接下来,我有一个抽象的AsyncMessageProvider,用于将Msg传递给AsyncRoutine 假设我创建了一个子类MyAsyncRoutine,它扩展了AsyncRoutine。我想创建一个支持此类的AsyncMessageProvider,因此我将对它进行子类化,MyAsyncMessageProvidermakingMy

如果这个问题是重复的,请原谅,我只是不知道如何用谷歌搜索来给出答案

首先,我有一个名为
AsyncRoutine
的抽象类,它是泛型的,并指定某种类型的
Msg
类型

接下来,我有一个抽象的
AsyncMessageProvider
,用于将
Msg
传递给
AsyncRoutine

假设我创建了一个子类
MyAsyncRoutine
,它扩展了
AsyncRoutine
。我想创建一个支持此类的
AsyncMessageProvider
,因此我将对它进行子类化,
MyAsyncMessageProvider
making
MyAsyncRoutine
它的泛型

MyAsyncMessageProvider
中,我有一个方法,
message(…)
,它被调用来传递
Msg
,在本例中是一个
整数


公共类MyAsyncMessageProvider扩展了AsyncMessageProvider{
受保护的无效消息(Msg){//编译错误,不知道“Msg”是什么
}
}
如何访问
AsyncMessageProvider
中的
MyAsyncRoutine
Integer
)的泛型类型?我基本上希望将
消息(…)
函数锁定到我在中指定的任何内容,因为我正在子类化
AsyncMessageProvider

有没有可能不经思考就做到这一点?或者有没有更好的方法?如果可能的话,我希望避免使用反射

最小可行示例

抽象类定义:

公共抽象类异步例程{
//实施并不重要
}
公共抽象类AsyncMessageProvider{//编译错误,无法解析消息
抽象无效消息例程(Msg m);
}
  • 如何在
    AsyncMessageProvider
    中使用
    Msg
    ,以便它与我使用子类
    AsyncMessageProvider
    的“
    AsyncRoutine
    ”中的泛型
    Msg
    ”匹配

将其类型添加到子类中:

public abstract class AsyncMessageProvider<Msg, Routine extends AsyncRoutine<Msg>> {
    abstract void messageRoutine(Msg m); 
}
如果他们认为该方法需要名为
Msg
的类的实例,则可以原谅


当您实际拥有一个名为
Msg
的类时,问题会变得更糟,因为同名的类型会隐藏相应的类,这会让您的同事感到悲伤。

公共类MyAsyncMessageProvider扩展了AsyncMessageProvider
解决了这个问题。不是吗?@Gendarme打败了我,但如果这不能解决问题,那么你大概只需要确保你的
消息()
方法使用了类型为
T
的参数,而不是其他硬编码类型的参数。@MichaelBerry@Gendarme我需要访问
AsyncMessageProvider
中的
AsyncRoutine
的泛型,以便为message()指定模板,在
MyAsyncMessageProvider
中重写时,它将默认为我扩展的任何内容。我如何在
AsyncMessageProvider
中定义它?@wdavies973您能发布一个帖子让我们仔细看看吗?也许是因为我的工作太累了,但我现在还没有完全明白。@MichaelBerry我编辑了这个问题,添加的内容是否让问题更清楚了?我完全理解,这个问题措辞不好。
public abstract class AsyncMessageProvider<T, Routine extends AsyncRoutine<T>> {
    abstract void messageRoutine(T t); 
}
abstract void messageRoutine(Msg m);