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

如何在java中重写泛型列表返回类型

郝修为
2023-03-14

我试图重写在子类中返回type as list的方法,如下例所示,由于泛型问题,我无法在子类中执行此操作。我无法更改我的超类代码,因此如何解决该问题?任何人都可以指引我。。。非常感谢。

无法更新的超类:

public class Animal {
           private String legs;
    }

public class TestSuper {

    public List<Animal> addAnimals() {
        return animals;
    }
}

子类:

public class Dog extends Animal {
         private String sound;
    }

public class TestSub extends TestSuper {

    public List<Dog> addAnimals() { --> I need to override this method but want return type as List of dogs
        return null;
    }
}

共有3个答案

钱修雅
2023-03-14

不能将列表的泛型类型更改为该泛型类型的子类型。问题是,对任何实例的引用都可以是该实例的子类型。让我们看看这个例子

SuperType sup = new SubType();
sup.getAnimals().add(new Cat());
//adding cat is possible because getAnimals() returns List<Animal>

因此,您将猫添加到只应包含狗的列表中,这是错误的。

此外,在重写方法中,您不能将列表的泛型类型更改为具有该泛型类型的超类型的列表(如<代码>列表

SuperType sup = new SubType();
Dog d = sup.getAnimals().get(0);

在subtype中,我们有动物列表,因此可能会返回Cat。

如果您可以更改类中的代码,那么可以尝试这种方法

class Super<T extends Animal> {
    public List<T> addAnimals() {
        return null;
    }
}

class Sub extends Super<Dog> {

    @Override
    public List<Dog> addAnimals() {
        return null;
    }
}
郑茂材
2023-03-14

如果动物的子类,您可能会这样做

以下签名:

public List<? extends Animal> addAnimals()

那就做

public List<Dog> addAnimals()

在子类中。

或者您可以将超类设置为泛型

百里秋月
2023-03-14

如果超级类真的无法更新,恐怕你根本无法更新。

如果您能够更新超级类:

在TestSuper中,您应该使用公共列表

您还有什么其他解决方案:

您可以使用以下实用方法:

@SuppressWarnings("unchecked")
public static <T extends Animal> List<T> cast(List<Animal> animals, Class<T> subclass) {
    List<T> out = new ArrayList<T>();
    for (Animal animal : animals) {
        if (!subclass.isAssignableFrom(animal.getClass())) {
            // the "animal" entry isn't an instance of "subclass"
            // manage this case however you want ;)
        } else {
            out.add((T) animal);
        }
    }
    return out;
}

然后,调用:

List<Dog> dogs = TheClassNameYouChose.cast(animals, Dog.class);
 类似资料:
  • 现在我希望以泛型的方式使用这些类。 如何从方法“method1”和“method2”返回泛型类型(可以是猫或狗)。我有几个返回“T extends Animal”的方法,所以最好在方法级别或类级别中声明泛型类型。

  • 我正在使用泛型在python中创建一个List类(类似于java列表的列表)。类节点也是通用的,我正在为上一个和下一个节点创建 getter 和 setters 方法。我想知道如何返回像类节点本身这样的类型?这是我的进步: 我试过 但它给了我错误

  • 我在我的Java程序中写了这个函数: 这就是我所说的: 它是有效的,但我觉得我应该能够省略第一个参数,并从返回类型(结果被分配到的类型)推断出它。这可能吗?如果是,语法是什么?

  • 问题内容: 我已经开始阅读有关Java序列化以及其他语言的一些文章,但是如果我有一个通用类并且想要将其实例保存到文件中该怎么办。 代码示例 保存此类对象的最佳方法是什么?(当然,在我真正的复习课程中还有更多,但我只是想知道实际的想法。) 问题答案: 您 需要照常制作通用类。 如果使用通用类型声明字段,则 可能需要 指定应实现。 请注意此处不常见的Java语法。

  • 我正在做一个体验,尝试用以下方式重写泛型类的方法: 为什么我不能?编译错误是 yGenFun。java:15:错误:对doX的引用不明确,Do中的方法doX(A)和MyGenFun中的方法doX(T)都匹配x.doX(“测试”);^其中A、T是类型变量:在类Do T中声明的extends对象扩展在类MyGenFun 1 error中声明的CharSequence 如果我注释“第1行”,我可以编译代