首页 > 解决方案 > 泛型参数化类型返回生成警告或错误

问题描述

在下面的示例代码中,我试图返回,但至少我得到了一个警告。其他情况(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());
    }

标签: javagenericsjava-11

解决方案


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

从您的cars方法的实现来看,您似乎想要返回一个Cars<Car>对象,但您的方法签名却另有说明。你的方法签名说

此方法可以返回Cars<C>where CisCar或 的任何子类Car,而您(调用者)可以决定是什么C

你的方法没有做到这一点,是吗?如果我写了一个Car被调用的子类Lorry,你的方法可以给我一个Cars<Lorry>吗?没有。

(在你说之前,不,aCars<Lorry>不是“一种” 。如果你不明白为什么,Cars<Car>请看这里。)

因此,您需要将签名更改为更“谦虚”的签名:)(没有通用参数)

static Cars<Car> cars()

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

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

推荐阅读