java 将子类传递给方法,但将超类作为参数?

db2dz4w8  于 2023-04-10  发布在  Java
关注(0)|答案(4)|浏览(125)

我有一个抽象类Vehicle,它有两个实现的子类RedVehicleYellowVehicle
在另一个类中,我有一个List<Vehicle>,它包含两个子类的示例。我希望能够向一个方法传递一个类类型,然后使用该类型来决定我想在List中对哪组对象做些什么。
由于Class是泛型的,我应该用一些东西来参数化它,但是将参数作为父类Vehicle会停止调用代码的工作,因为exampleMethod现在需要的是Vehicle类型,而不是RedVehicleYellowVehicle的子类。
我觉得应该有一个干净的方式来做到这一点,那么什么是正确的方式来实现功能?
注意:我不一定要传入Class类型,如果有更好的建议,我很乐意尝试。
调用代码:

service.exampleMethod(RedVehicle.class);
service.exampleMethod(YellowVehicle.class);

字段/方法:

//List of vehicles
//Vehicle has 2 subclasses, RedVehicle and YellowVehicle
private List<Vehicle> vehicles;

//Having <Vehicle> as the Class parameter stops the calling code working
public void exampleMethod(Class<Vehicle> type) 
{
    for(Vehicle v : vehicles)
    {
        if(v.getClass().equals(type))
        {
            //do something
        }
    }
}
svujldwt

svujldwt1#

请改为执行以下操作:

public <T extends Vehicle> void exampleMethod(Class<T> type)
41zrol4v

41zrol4v2#

你为什么不用visitor pattern
这样你

  • 不需要类型标记
  • 让dynamic dispatch处理大小写区别(而不是if(v.getClass().equals(type))
  • 更灵活(遵循OCP

详细内容:
你的抽象类Vehicle得到一个方法accept(Visitor v),子类通过调用v上的适当方法来实现它。

public interface Visitor {
  visitRedVehicle(RedVehicle red);
  visitYellowVehicle(YellowVehicle yellow);
}

使用访客:

public class Example {

  public void useYellowOnly() {
    exampleMethod(new Visitor() {
        visitRedVehicle(RedVehicle red) {};
        visitYellowVehicle(YellowVehicle yellow) {
             //...action
        });
  }
  public void exampleMethod(Visitor visitor){
      for(Vehicle v : vehicles) {
          v.accept(visitor);
      }  
  }
}
zvms9eto

zvms9eto3#

我想我会加上这个,只是为了让任何可能需要它的人更清楚。
在本例中,RevisedExposure是Exposure的一个子类,我需要调用GetMetadata(),其中包含这两个类中的任何一个,这将导致相同的结果集。

private async Task<List<Metadata>> GetMetadata<T>(List<T> exposures) where T : Exposure

现在我可以用不同版本的列表从两个地方调用这个方法。

var metadata = await GetExposureMetadata(revisions);

var metadata = await GetExposureMetadata(exposures);

工作很棒!

7qhs6swi

7qhs6swi4#

我发现这个语法按预期工作:

public void exampleMethod(Class<? extends Vehicle> type)

相关问题