Java – 为参数化泛型类获取比“Class <?>”更具体的类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java – 为参数化泛型类获取比“Class <?>”更具体的类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3191字,纯文字阅读大概需要5分钟。
内容图文
![Java – 为参数化泛型类获取比“Class <?>”更具体的类型](/upload/InfoBanner/zyjiaocheng/810/bbecd99b6b4d43c6bc809d297969ef46.jpg)
我有一个基本接口,使用扩展相同基接口的类型R进行参数化:
public interface IWidget<R extends IWidget<R>> {}
然后以相同的方式参数化另一个接口:
public interface IWidgetManager<R extends IWidget<R>> {}
最后,一个类实现了第二个接口.这个类将在声明时收到IWidget实现类:
public class MyWidgetManager<R extends IWidget<R>> implements IWidgetManager<R> {}
我的问题 :
我们可以用来指定MyWidgetManager的更具体的类型是什么?
类<?>工作,当然:
public Class<?> ok() {
return MyWidgetManager.class;
}
但它非常通用,我想要更具体的东西……
这些尝试不编译:
public Class<? extends IWidgetManager<?>> fails() {
return MyWidgetManager.class;
}
==>类型不匹配:无法转换为Class< MyWidgetManager>到班级<?扩展IWidgetManager<?>>
public <R extends IWidget<?>> Class<? extends IWidgetManager<R>> fails() {
return MyWidgetManager.class;
}
==>类型不匹配:无法转换为Class< MyWidgetManager>到班级<?扩展IWidgetManager< R>>
public <R extends IWidget<R>> Class<? extends IWidgetManager<R>> fails() {
return MyWidgetManager.class;
}
==>类型不匹配:无法转换为Class< MyWidgetManager>到班级<?扩展IWidgetManager< R>>
public Class<? extends IWidgetManager<? extends IWidget<?>>> fails() {
return MyWidgetManager.class;
}
==>类型不匹配:无法转换为Class< MyWidgetManager>到班级<?扩展IWidgetManager<?扩展IWidget<?>>>
有没有什么方法可以让我的类型比Class<?>更具体?对于MyWidgetManager.class?
更新:
我更改了界面的名称.最后一堂课本身并不是一个小工具,这在我原来的问题中并不清楚……对于这种困惑感到抱歉.
更新2:
事实上,在使用混凝土类型时,事情会更容易.
这非常特定于我目前的情况,但我认为我将通过转换MyWidgetManager< R extends IWidget< R>>来解决我的“问题”.实现IWidgetManager< R>进入一个没有实现任何东西的WidgetManagerBase.然后使用具体的Widget类提供默认实现.最后,get方法可以轻松覆盖(从一开始,这是我的主要目标!).所以:
public interface IWidget<R extends IWidget<?>> {}
public interface IWidgetManager<R extends IWidget<R>> {}
public class WidgetManagerBase {}
// Default implementation
public class WidgetA implements IWidget<WidgetA> {}
public class AWidgetManager extends WidgetManagerBase implements IWidgetManager<WidgetA> {}
// default get method
public Class<? extends IWidgetManager<?>> getWidgetManagerClass() {
return AWidgetManager.class;
}
//然后可以使用以下方法覆盖默认的get方法:
public class WidgetB implements IWidget<WidgetB> {}
public class BWidgetManager extends WidgetManagerBase implements IWidgetManager<WidgetB> {}
@Override
public Class<? extends IWidgetManager<?>> getWidgetManagerClass() {
return BWidgetManager.class;
}
解决方法:
因为Java Type Erasure,MyWidget.class最具体的匹配是Class<?扩展IWidget>:
public Class<? extends IWidget> test() {
return MyWidget.class;
}
如果你想要更具体,你应该使用具体的类型参数扩展MyWidget:
public class ConcreteBaseWidget implements IBaseWidget<ConcreteBaseWidget> {
}
public class ConcreteWidget extends MyWidget<ConcreteBaseWidget> {
}
然后所有这些方法都会起作用:
public Class<? extends IWidget<? extends IBaseWidget<? extends IBaseWidget<?>>>> test1() {
return ConcreteWidget.class;
}
public Class<? extends IWidget<? extends IBaseWidget<ConcreteBaseWidget>>> test2() {
return ConcreteWidget.class;
}
public Class<? extends IWidget<? extends ConcreteBaseWidget>> test3() {
return ConcreteWidget.class;
}
内容总结
以上是互联网集市为您收集整理的Java – 为参数化泛型类获取比“Class <?>”更具体的类型全部内容,希望文章能够帮你解决Java – 为参数化泛型类获取比“Class <?>”更具体的类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。