当前位置: 首页 > 知识库问答 >
问题:

在构造函数中指定重复的泛型类型?

周通
2023-03-14

假设我有以下课程:

import java.util.function.Function
import java.util.List

class Foo<X, Y> {
    public Function<X, Y> converter;
    public List<X> inputs;

    public Foo(Function<X, Y> converter, List<X> inputs) {
        this.converter = converter;
        this.inputs = inputs;
    }
}

我想添加一个构造函数,它需要一个List

public Foo(List<X> inputs) {
    this(Function.identity(), inputs);
}

但是,这给了我一个错误:构造函数Foo

public static <X> Foo<X, X> makeFoo(List<X> inputs) {
    return new Foo<>(Function.identity(), inputs);
}

事实上,以下方法也有效:

public Foo(List<X> inputs) {
    this.converter = (Function<X, Y>)Function.identity();
    this.inputs = inputs;
}

然而,在这里,我必须对函数进行未经检查的强制转换

有没有办法让构造器使用这种方法而不是诉诸静态方法或强制转换?

我试着用这个((函数)调用另一个构造函数

似乎应该有一种方法让编译器知道函数。identity()参数或创建的Foo类型为

谢谢你的帮助。


共有1个答案

公孙英飙
2023-03-14

不,没有更好的办法了。您不能限制此构造函数仅在XY是相同类型时工作,因此构造函数必须假设它们是不同的,并且相应地Function.identity()不一定是正确的类型。

也就是说,使用静态工厂方法通常比公开构造函数更好,如果你这样做了,你就没事了。

 类似资料:
  • 问题内容: 如果我有一个像这样的抽象类: 还有一些从Item派生的类是这样的: 我不明白为什么我不能使用泛型调用构造函数: 我知道可以有一个没有构造函数的类型,但是这种情况是不可能的,因为Pencil具有没有参数的构造函数,而Item是抽象的。但是我从eclipse中得到了这个错误: 无法实例化 我不明白为什么的 T类型 ,以及如何避免这种情况? 问题答案: 无法使用Java类型系统来强制类层次结

  • 问题内容: 我想创建一个KeyValue类,但以通用方式,这就是我写的内容: 错误显示:“令牌“>上的语法错误”,此令牌后应有标识符” 那我该如何在Java中创建一个通用构造函数呢? 问题答案: 您需要从构造函数的签名中删除:它已经隐式存在。

  • 我正在初始化的代码: 如何根据 类型在我的 函数中启动 ? ps-getForObject是spring restTemplate的标准函数-http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html#getForObject-java.lang.Str

  • 我正在做作业,所以我只想修复我的编译错误,这样我就可以继续工作了。我需要创建一个PointList类,在ArrayList中保存一个Point对象列表。PointList类应该接受任何作为Point类实例或Point子类的对象。 我不断收到一个编译器错误,上面写着 我真的不明白我错过了什么,我已经通读了这本书,似乎不明白为什么我会得到这个错误。我已经制作了 Point 类并完成了测试,但似乎无法编

  • 问题内容: 是否可以为特殊/构造的泛型类型扩展泛型类?我想使用一种方法来扩展Int Arrays,以计算其元素的总和。 例如 问题答案: Swift 5.x:

  • null 我不太确定如何处理我的代码,以下是我得到的: 我只是不知道我应该打什么。我相信我已经完成了第一个重载构造函数,但我对此还是新手。 那么,我应该做些什么来使重载构造函数工作呢? 我对Java和面向对象编程非常陌生。