繁体   English   中英

泛型扩展泛型,向下传递类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM