gpt4 book ai didi

java - 通用参数化类型返回生成警告或错误

转载 作者:行者123 更新时间:2023-11-30 01:42:29 25 4
gpt4 key购买 nike

在下面的示例代码中,我尝试返回,但至少我收到了警告。其他场景(2 和 3)会导致错误。是否有正确的返回方法不会导致警告?

    static class Cars<C extends Car> {

private C c;

Cars(C c) {
this.c = c;
}
}

static class Car { }

static <C extends Car> Cars<C> cars() {
// 1. WARNING: 'Raw use of parameterized class 'Cars''
// return new Cars(new Car());
// 2. ERROR: 'Cannot infer arguments'
// return new Cars<>(new Car());
// 3. ERROR: 'Required C provided Car'
// return new Cars<C>(new Car());
}

最佳答案

我认为您在这里滥用或至少误解了泛型。理解泛型参数是由调用者而不是被调用者决定是非常重要的。

从执行您的cars方法,你似乎想返回 Cars<Car>对象,但你的方法签名另有说明。你的方法签名说

this method can return a Cars<C> where C is Car or any subclass of Car, and you, the caller, gets to decide what C is.

你的方法没有做到这一点,是吗?如果我写了 Car 的子类叫Lorry ,你的方法能给我一个 Cars<Lorry> ?不。

(在你说之前,不, Cars<Lorry> 不是“一种” Cars<Car> 。如果您不明白为什么,请参阅 here 。)

所以你需要将签名更改为更“谦虚”的签名:)(不带通用参数)

static Cars<Car> cars()

并使用这一行作为返回语句:

return new Cars<>(new Car());

关于java - 通用参数化类型返回生成警告或错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59466927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com