"更具体的类型-6ren"> "更具体的类型-我有一个使用类型参数化的基本接口(interface) R扩展相同的基础接口(interface): public interface IWidget> {} 然后另一个接口(interface)以同-6ren">
gpt4 book ai didi

Java - 为参数化泛型类获取比 "Class"更具体的类型

转载 作者:搜寻专家 更新时间:2023-11-01 02:22:48 25 4
gpt4 key购买 nike

我有一个使用类型参数化的基本接口(interface) R扩展相同的基础接口(interface):

public interface IWidget<R extends IWidget<R>> {}

然后另一个接口(interface)以同样的方式参数化:

public interface IWidgetManager<R extends IWidget<R>> {}

最后,一个类实现了第二个接口(interface)。此类将收到 IWidget 实现 类何时声明:

public class MyWidgetManager<R extends IWidget<R>> implements IWidgetManager<R> {}

我的问题:

我们可以用来指定 MyWidgetManager更具体的类型是什么? ?

Class<?>当然有效:

public Class<?> ok() {
return MyWidgetManager.class;
}

但它非常通用,我想要更具体的东西......

这些尝试无法编译:


public Class<? extends IWidgetManager<?>> fails() {
return MyWidgetManager.class;
}

==> 类型不匹配:无法从 Class 转换为 Class >>


public <R extends IWidget<?>> Class<? extends IWidgetManager<R>> fails() {
return MyWidgetManager.class;
}

==> 类型不匹配:无法从 Class 转换为 Class >


public <R extends IWidget<R>> Class<? extends IWidgetManager<R>> fails() {
return MyWidgetManager.class;
}

==> 类型不匹配:无法从 Class 转换为 Class >


public Class<? extends IWidgetManager<? extends IWidget<?>>> fails() {
return MyWidgetManager.class;
}

==> 类型不匹配:无法从 Class 转换为 Class >>>


有什么方法可以得到比 Class<?> 更具体的类型吗?对于 MyWidgetManager.class

更新:我更改了接口(interface)的名称。最后一个类本身不是 Widget,这在我最初的问题中并不清楚......很抱歉造成混淆。

更新 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;
}

关于Java - 为参数化泛型类获取比 "Class<?>"更具体的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34767401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com