如何在 Java 中从另一个泛型类型参数推断出泛型类型参数?

问题描述 投票:0回答:1

我正在使用一个在 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 generics type-inference
1个回答
0
投票

在 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() 等方法中的返回类型。 请记住,使用反射可能会对性能产生影响,因此请谨慎使用。

© www.soinside.com 2019 - 2024. All rights reserved.