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

如何向泛型扩展类并实现接口的列表添加类型安全的元素?

郎雪风
2023-03-14

我正在寻找一个类型安全的,选中的解决方案,以添加一个元素到一个列表,它的泛型需要一个类和一个接口。该示例说明了我想要做的事情--将一个对象添加到一个列表中,该对象的类型cat扩展了Animal并实现了quadruped,其中t扩展了Animal&quadruped

class Example {
    public interface Quadruped { };
    public static class Animal { };
    public static class Cat extends Animal implements Quadruped { };

    public <T extends Animal & Quadruped> List<T> getQuadrupedAnimals(){
        List<T> result = new ArrayList<>();
        Cat cat = new Cat();
        result.add(cat); // compile error
        return result;
    }
}

当然,将cat转换为b会解决编译错误,但这将被取消检查。

有什么办法解决这个问题吗?如果没有,有没有人知道编译器不允许这样做的原因?

共有1个答案

柳珂
2023-03-14

有人知道编译器不允许这样做的原因吗?

T是一种特定的动物,在GetQuadrupedAnimals()的调用站点选择,并被四次强奸。

对该方法的合法引用包括:

List<Dog> listOfDogs = getQuadrupedAnimals();
List<Hamster> listOfHamsters = getQuadrupedAnimals();

因此,您不能将放入该列表(也不能将仓鼠放入该列表)。

如果要返回列表 ,则解决方案是将返回类型声明为列表

交集类型只有在参数中使用时才真正有用,例如。

public <T extends Animal & Quadruped> List<T> getQuadrupedAnimals(T animal){
  return List.of(animal);
}

public <T extends Animal & Quadruped> int countLegs(List<T> animals){
  return 4 * animals.size();
}
 类似资料:
  • 问题内容: 为了减少类的依赖性,我想将参数(使用泛型类)发送到扩展某些类并实现接口的构造函数,例如 可能吗? 此外,使用T类,我想使用T.getActivity()作为Context创建视图。 问题答案: T必须扩展Fragment并实现SomeInterface 在这种情况下,您可以声明以下内容: 这将需要扩展和实现类型的对象。 此外,使用T类,我想使用T.getActivity()作为Cont

  • 问题内容: 我有课 和班级 关键是该方法不安全,因为我可以提供的项目与当前报告无关,但与其他报告相关,编译器不会抱怨。 是否可以用类型安全的方式编写该方法,即我们可以仅将T作为当前报表的类型作为参数传递。 问题答案: 我认为您正在寻找以下内容。 它的工作方式是: 您想用从 您要确保所有列表都属于同一类型 为了将参数绑定到从扩展的对象,您需要对自身进行参数化: 您添加需要从报表扩展的绑定 但是您要

  • 假设我想要一个类型变量T,它扩展了某个类并实现了一个接口。类似于: Kotlin中的语法是什么?

  • 编译时,此代码将产生以下+错误: 问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?

  • 考虑一个具有的API,如下所示: 很简单,只有页面大小和跳过计数属性。 此外,现在我还有一些类,它们也包含但未分页。 在我的测试中,我希望他们都能实现一个接口,这样我就可以用一些更基本的测试来生成一个通用的基本测试类。为此,我添加了我认为会起作用的内容: 我将PagedResults更改为: 错误 但现在编译器抱怨PagedResultBase继承的所有地方的使用情况(?)从。 但是,如果我将接口