Java泛型类型非静态方法返回对象而不是泛型类型T

问题描述

public class Module<T> {

    @SuppressWarnings("unchecked")
    public <T> T module(Class<T> clazz) {
        return clazz.cast(this);
    }
        
}

这是我的模块的基类,我想通过调用上面的模块方法将其初始化为 TestModule。

TestingModule testingModule = new Module().module(TestingModule.class);

但是,返回类型

new Module().module(TestingModule.class)

是 Object 而不是 TestingModule。有没有什么想法可以直接初始化它而不使用任何强制转换或将方法更改为静态

解决方法

有几个问题。与类型不匹配错误最直接相关的一个在这里:

TestingModule testingModule = new Module().module(TestingModule.class);

new Module() 使用没有任何类型参数的 Module。当您使用这样的原始类型时,您将丢失表达式中的所有通用信息。你可以简单地通过添加一个类型参数来修复它:

TestingModule testingModule = new Module<String>().module(TestingModule.class);

在上面的代码中,我在构造函数调用中添加了 <String>,从而解决了问题。但是 String 是一个奇怪的类型参数,因为它在这种情况下可以得到,这导致了以下旁注。

声明public <T> T module(Class<T> clazz)添加了一个类型变量T,它隐藏了同名的类级类型变量。如果此方法不是意外通用,请为此变量使用不同的名称,并使用它。否则,此方法不需要是通用的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...