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

Java中泛型类的属性访问

沈弘文
2023-03-14

嗨,我是Java泛型的新手,我正在尝试访问泛型类中的属性。到目前为止,我已经找到了C#相关的答案,如果有人能指导我如何在java中做到这一点,那将是非常有帮助的。假设我有Class Car,它有整数型轮子和字符串型模型的属性。现在我有一个方法,比如车辆助手(列表

List<Car> cars = new ArrayList<>();
cars.add(new Car(4, "Honda"));
vehiclehelper(cars);

现在来看VehiclePermethod,在它的主体中,我想循环一下列表

for(T vehicle: vehicles)
  count+ = vehicle.getWheels();

现在在这里,我得到了一个错误,说属性没有定义。如何从泛型类型列表中获取wheel属性?


共有2个答案

夏侯华彩
2023-03-14

你的车不是通用的。这是普通课。您只需通过通用列表集合操作汽车对象。如果字段是私有的,那么通过getter或setter访问Car字段不应该有任何问题。下面的代码非常有效。

public class App {
    public static void main(String[] args) {
        List<Car> carList = new ArrayList<>();
        carList.add(new Car(4, "Honda"));
        carList.add(new Car(3, "Polaris Slingshot"));
        System.out.println(carHelper(carList)); // the result is 7
    }

    static int carHelper(List<Car> cars) {
        int count = 0;
        for (Car car : cars) {
            count += car.getWheel();
        }
        return count;
    }
}

class Car {
    private int wheels;
    private String name;

    public Car(int wheels, String name) {
        this.wheels = wheels;
        this.name = name;
    }

    public int getWheels() {
        return wheels;
    }

    public void setWheels(int wheels) {
        this.wheels = wheels;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

如果你想对任何对象类型使用通用方法carHelper,那么你必须使它泛化:

static <T> int carHelper(List<T> elements) {
    int count = 0;
    for (T element : elements) {
        count += element.getWheel();
    }
    return count;
}

但在这种情况下,在元素处会出现编译时错误。getWheel()因为T类型是未知类型。编译器不知道他的方法。为了找到一些通用的解决方案,我们必须定义方法参数的边界。假设输入参数为车辆或其子系统。比如说,在Vehicle类中,我们将引入所需字段,他的后代将继承这些字段。在下面列出的情况下,该方法将起作用。阅读泛型中的通配符。

static  int carHelper(List<? extends Car> elements) {
    int count = 0;
    for (Car element : elements) {
        count += element.getWheels();
    }
    return count;
}
裘禄
2023-03-14

创建一个接口ICar或一个抽象类来表示一辆汽车,并拥有你期望汽车拥有的方法(例如getWheels())。

然后将实现/扩展该类的对象列表作为参数carHelper(列表)发送

 类似资料:
  • 当我使用Jackson ectivtMapper将有效负载序列化为字符串值时,我很难获取要维护的泛型属性的类型信息。 我想要达到的结果如下。 我实际得到的结果如下(注意TestClassA缺少@type信息)。 我使用的测试是: “test JSON编组”测试中有两个版本。注释掉的版本和未注释的版本都会产生完全相同的结果。 第二个测试验证TestClassA本身是否生成了正确的类型信息。 只有当包

  • 问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符

  • 如果在Java中创建泛型类(该类具有泛型类型参数),是否可以使用泛型方法(该方法采用泛型类型参数)? 考虑下面的例子: 正如您所期望的那样,对于任何对象,的实例,我都可以调用: 但是,如果我试图使用的实例而不指定泛型类型,那么调用将返回一个

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 当我创建一个带有父对象引用的子对象时,比如

  • npm包允许我们在TypeScript应用程序中使用反应。我们将组件定义为 在这里,我们必须声明组件道具和状态的类型(在类型变量中)。 在我们声明了这些类型之后,TypeScript使用这些类型来验证组件的使用(传递给它的道具的形状)。 我想围绕这样一个组件创建一个容器。容器将重用组件的道具。但是为了用相同的道具创建另一个组件,我必须重新声明道具的类型。或者从原始零部件文件中导出它们并导入到容器中