【问题标题】:Java Generic Type non-static method return Object instead of generic type TJava 泛型类型非静态方法返回 Object 而不是泛型类型 T
【发布时间】:2021-06-28 06:45:57
【问题描述】:
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);

但是,返回类型

新模块().module(TestingModule.class)

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

【问题讨论】:

  • 您没有使用该类的泛型类型,因此要么删除它(尽管我假设您想在其他地方使用它),将方法的泛型类型更改为其他类型(例如&lt;U&gt; U module(Class&lt;U&gt; clazz))或实际上使用类的类型:从方法中删除&lt;T&gt;并将您的模块创建为new Module&lt;TestModule&gt;
  • TestingModuleTestModule。也许你把这些弄混了。编译器肯定不会将方法级别的T 推断为TestingModule,这就是你得到Object 的原因。但是,您将类级别类型变量 T 与方法级别变量一起隐藏这一事实非常狡猾。
  • @ernest_k 哦,对不起,我的问题是错字。已编辑。

标签: java class generics non-static


【解决方案1】:

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

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

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

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

在上面的代码中,我在构造函数调用中添加了&lt;String&gt;,从而解决了问题。但是String 在这种情况下是一个很奇怪的类型参数,这就引出了下面的旁注。

声明public &lt;T&gt; T module(Class&lt;T&gt; clazz)添加了一个类型变量T,它隐藏了同名的类级类型变量。如果这个方法不是偶然的,请为这个变量使用不同的名称,并使用它。否则,这个方法不需要是泛型的。

【讨论】:

    猜你喜欢
    • 2016-12-24
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多