Java - getting a more specific type than "Class <?>" For a parameterized general class
I have a base interface that is parameterized using a type Rthat extends the same base interface:
public interface IWidget<R extends IWidget<R>> {}
Then the other interface is parameterized in the same way:
public interface IWidgetManager<R extends IWidget<R>> {}
Finally, the class implements the second interface. This class will receive the implementation class IWidgetwhen it is declared:
public class MyWidgetManager<R extends IWidget<R>> implements IWidgetManager<R> {}
My question is:
What is the more specific type we can use to indicate MyWidgetManager?
Class<?> works of course:
public Class<?> ok() {
return MyWidgetManager.class;
}
But it is very general, and I would like something more specific ...
These attempts will not compile:
public Class<? extends IWidgetManager<?>> fails() {
return MyWidgetManager.class;
}
==> Type mismatch: cannot convert from class <MyWidgetManager> to class <? extends IWidgetManager <? →
public <R extends IWidget<?>> Class<? extends IWidgetManager<R>> fails() {
return MyWidgetManager.class;
}
== > : <MyWidgetManager> <? IWidgetManager < R →
public <R extends IWidget<R>> Class<? extends IWidgetManager<R>> fails() {
return MyWidgetManager.class;
}
== > : <MyWidgetManager> <? IWidgetManager < R →
public Class<? extends IWidgetManager<? extends IWidget<?>>> fails() {
return MyWidgetManager.class;
}
== > : <MyWidgetManager> <? IWidgetManager <? IWidget <? → >
, Class<?> MyWidgetManager.class?
: . - , ... .
2:
, .
, , "", MyWidgetManager<R extends IWidget<R>> implements 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<? extends 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;
}
,
public interface IBaseWidget<R extends IBaseWidget<R>> {}
public interface IWidget<R extends IWidget<R>> extends IBaseWidget<R> {} //not sure about this one.
public class MyWidget implements IWidget<MyWidget> {}
, MyWidget.class Class<R>.
, , ?
EDIT:
public interface IWidgetManager<R extends IWidget<R>> {}
public class MyWidgetManager<R extends IWidget<R>> implements IWidgetManager<R> {}
public interface IWidgetManager<R extends IWidget<R>, WM extends IWidgetManager<R, WM>> {}
public class MyWidgetManager<R extends IWidget<R>> implements IWidgetManager<R, MyWidgetManager> {}
MyWidgetManager.class Class<WM>.