Paramterized class, how to reference the paramterized type of something passsed as a paramterized type
对不起,如果标题很烂,不知道如何问这个问题……
假设我有一些接口 Foo 需要一个参数
1
2 3 4 |
public interface IFoo<Bar extends IBar>{
public Bar generateBar(); |
我有另一个类,它接受一个 foo 对象并将生成一个 bar 对象。我可以这样定义。
1
2 3 4 5 6 7 8 9 10 11 |
public class FooBar<Bar extends IBar, Foo extends IFoo<Bar>>{
private Foo foo; public FooBar(Foo foo){ public Bar getBar(){ |
这一切都很好。但是,将 Bar 定义为 FooBar 类的参数对我来说似乎很愚蠢。 IFoo 对象将被参数化以获取 Bar 值,所以我假设我可以从 Foo 对象具有的任何参数推断 Bar 的类型;从而避免有人在每次定义 FooBar 对象时都必须提供两个参数。
有什么办法可以做到这一点吗?不是让 Bar 成为 FooBar 参数化类型的一部分,而是从 Foo 的参数中推断出来?
edit:答案似乎是无法完成,正如已经回答的那样。但是,我将把它留到另一天,因为我希望有人可以发布一个答案,不仅可以做到,而且为什么不可能。具体来说,这仅仅是 java 开发人员从未选择支持的用例,还是有一个原因,支持其他参数化检查的相同编译时类型检查无法通过查看特定的 IFoo 类型参数来推断 Bar 类型。编译器不能确定 IFoo 参数以及任何参数化类型吗?
如果你关心
但是,如果您在代码中不关心
1 | class FooBar<Foo extends IFoo<? extends IBar>>{ |
你的
1
2 3 |
public IBar getBar(){
return this.foo.generateBar(); } |
为了有一个创建 Bar 对象的方法,你需要一个
1
2 3 4 5 6 7 |
class FooBar …{ Class<Bar> barClass = …; public Bar getBar(){ |
有多种方法可以获取 barClass。我不确定要推荐什么设计,因为您给了我们任意类型 Foo、Bar 等。
更通用的解决方案是:
1
2 3 4 5 6 7 |
class FooBar< T > …{ Class< T > someClass = …; public T getInstance(){ |
您需要以某种方式将
回答我自己的问题,只是提到我在特定情况下使用的方法,一种解决方法,因为我想要的东西无法完成。老实说,这很简单,所以我应该先尝试一下,但我一直想知道参数化可以做什么。
我的 FooBar 等效项现在如下所示:
1
2 3 4 5 6 7 8 9 10 11 |
public class FooBar<Bar extends IBar>{
private IFoo<Bar> foo; public FooBar(IFoo<Bar> foo){ public Bar getBar(){ |
大概你的getBar 方法会返回一个Bar。由于类型擦除,您无法推断类型。您可以返回一个裸对象进行强制转换,但这违背了泛型的目的。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/java/267479.html