我正在使用一个在 Java 中使用两个泛型类型参数的类,但我发现第二个类型参数是多余的,因为它已经由第一个类型参数确定了。
这是当前的类声明:
public abstract class GameScreen<C extends Controller<G>, G extends Game> extends MPScreen {
public G getGameInstance() {
// ...
}
public C getController() {
// ...
}
// ...
}
Controller
是一个通用类型,采用 Game
类型,如下所示:
public abstract class Controller<G extends Game> {
// ...
}
我想避免直接指定第二个类型参数(
G
),因为它已经由C
确定了。但是,我仍然想在某些方法中使用 G
作为返回类型(例如 getGameInstance()
)。
我尝试像这样重写课程:
public abstract class GameScreen<C extends Controller<? extends Game>> extends MPScreen {
public C getController() {
// ...
}
}
但是通过这种方法,我无法将
G
作为一种不同的类型进行访问,因此我无法在 getGameInstance()
等方法中将其用作返回类型。
我的问题是: Java 中有没有一种方法可以从类型
G
推断出类型参数 C
,而无需显式声明 G
作为第二个类型参数?或者是否有更干净的方法来实现此目的,同时仍将 G
作为方法返回类型?
在 Java 中,如果不显式地将类型参数 G 声明为第二个类型参数,则无法直接从类型 C 推断出类型参数 G。但是,您可以考虑采用另一种方法来实现您的目标。 一种选择是引入一个辅助方法,从类型参数 C 中提取类型参数 G。下面是一个示例:
public abstract class GameScreen<C extends Controller<?>> extends MPScreen {
public abstract C getController();
public Class<?> getGameType() {
Type type = getClass().getGenericSuperclass();
ParameterizedType paramType = (ParameterizedType) type;
Type[] typeArguments = paramType.getActualTypeArguments();
return (Class<?>) typeArguments[0];
}
public Game getGameInstance() {
Class<?> gameType = getGameType();
// ...
}
}
在此示例中,getGameType() 方法使用反射从类型参数 C 中提取类型参数 G。它从 GameScreen 类的泛型超类中检索实际类型参数,并返回第一个类型参数。这样,您仍然可以将 G 作为不同类型进行访问,并将其用作 getGameInstance() 等方法中的返回类型。 请记住,使用反射可能会对性能产生影响,因此请谨慎使用。