【问题标题】:How to return generic object in function?如何在函数中返回通用对象?
【发布时间】:2021-04-02 23:11:08
【问题描述】:

我想返回通用对象,但我收到关于错误提供的返回对象的错误 - 提供:人类,预期:T

包含返回通用对象函数的类:

public class DataHuman<T extends HumanProcess>  {

    public T getObject() {
        return Human.builder().build();
    }
}

界面:

public interface HumanProcess {
}

扩展接口的对象:

@Data
@Builder
public class Human implements HumanProcess {

    private String name;
}

我想创建更多类似 Human 的类来实现 HumanProcess 并在 getObject() 中返回它。

【问题讨论】:

  • 建造者来自龙目岛
  • A Human 不是T - 如果TSomeSpecificSubclass 其中extends Human 那么你不能简单地返回一个简单的基本Human
  • 你可以使用HumanProcess 作为你的方法getObject的类型返回
  • @HadesZazif 那么如果您从不使用T 的意义何在? OP 只需要阅读一些关于泛型的教程并习惯它们。
  • 这似乎并不是真正意义上的通用,正如@HadesZazif所说,它实际上只取决于HumanProcess

标签: java


【解决方案1】:

一旦您引入HumanProcess 的另一种实现,就可以清楚地看出什么是损坏的:

static class AlmostHuman implements HumanProcess {

}

并且(为了这个例子),做:

return (T)Human.builder().build();

这种转换是没有用的,因为编译器不会以任何方式强制它,但至少代码可以编译。但是当然如果你以以下形式使用它:

 DataHuman<AlmostHuman> dh = new DataHuman<>();
 AlmostHuman almost = dh.getObject();

它将在运行时失败。这应该很明显,Human 不能转换为 AlmostHuman

您的解决方案可能是在getObject 方法中返回HumanProcess

static class DataHuman<T extends HumanProcess>  {

    public HumanProcess getObject() {
        return Human.builder().build();
    }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 2020-01-31
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    相关资源
    最近更新 更多