" For a parameterized general class I have a base interface that is parameterized using a ty...">

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;
}
+4
2

- 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;
}
+3

,

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>.

+2

Source: https://habr.com/ru/post/1624105/


All Articles