泛型构造函数在 Java 中有什么用途?

2022-09-01 05:46:04

众所周知,您可以使用类型参数在Java中拥有一个泛型类:

class Foo<T> {
    T tee;
    Foo(T tee) {
        this.tee = tee;
    }
}

但是,您也可以使用泛型构造函数,这意味着显式接收自己的泛型类型参数的构造函数,例如:

class Bar {
    <U> Bar(U you) {
        // Why!?
    }
}

我正在努力理解用例。此功能允许我执行哪些操作?


答案 1

我想到的用例可能是有些人想要一个从2类型继承的对象。例如,实现 2 :interfaces

public class Foo {

    public <T extends Bar & Baz> Foo(T barAndBaz){
        barAndBaz.barMethod();
        barAndBaz.bazMethod();
    }
}

虽然我从未在生产中使用它。


答案 2

在你提供的示例中,很明显,它在类的构造函数中不起任何作用,因为它实际上在运行时变成了一个:UObject

class Bar {
    <U> Bar(U you) {
        // Why!?
    }
}

但是,假设我希望我的构造函数只接受扩展其他类或接口的类型,如下所示:

class Foo<T extends Baz> {
    <U extends Bar> Foo(U u) {
        // I must be a Bar!
    }
}

请注意,该类已在使用中具有不同的泛型类型;这允许您使用与类定义不相关的单独泛型类型。

当然,我从来没有使用过这样的东西,我也从未见过它在使用中,但这是可能的!