【问题标题】:How can i pass different classes in a java method我如何在java方法中传递不同的类
【发布时间】:2021-05-10 16:00:56
【问题描述】:

我有两个类,我想将它们传递给一个方法,以便我可以使用它们来设置数组适配器。

以下是我的车辆类别

public class Car{
   
    private int yearModel;
    private String brand;
    private int priceModel;
    private int numberModel;

}

那么下面是我的

public class House{

  private int id;
  private double area;
  private String whenBuilt;
  
}

我正在调用一个方法,我应该通过其中任何一个类,我怎么能做到这一点

下面是我的方法

private void setUpAdapter(Class class){

  ArrayAdapter<class> clientArrayAdapter = new ArrayAdapter<>(requireActivity(),
                android.R.layout.simple_list_item_1, clientList);

}

在正常情况下,我只会使用设置适配器

ArrayAdapter<Car> clientArrayAdapter = new ArrayAdapter<>(requireActivity(),
                android.R.layout.simple_list_item_1, myList);


ArrayAdapter<House> clientArrayAdapter = new ArrayAdapter<>(requireActivity(),
                android.R.layout.simple_list_item_1, myList);

但是我想要实现的应该是这样的


House house = new House()
Car car = new Car()

if(condition == something){
 
  setUpAdapter(house);

}else if(condition == something{

 setUpAdapter(car);

}

【问题讨论】:

  • 您想利用这两个类的哪些共同功能?当然,您可以编写一些通用的超级接口。如果您真的只希望它们成为 any 对象(这不太可能),那么您可以传递 Object,但这可能不是您想要的。
  • @SilvioMayolo 正在设置下拉菜单/微调器,有一个用于汽车的下拉菜单和一个用于房屋的下拉菜单我只想使用一种方法来设置它们,条件是有时汽车下拉菜单将被隐藏,而房屋下拉菜单将被隐藏,我也想为所有这些使用一个装载机,以防汽车和房屋的列表同时被填充我不想有一个装载机加载并完成然后第二个加载器再次加载
  • 目前,这两个类没有任何共同之处。请阅读 Liskov 替换原则。
  • @NomadMaker 我刚刚使用这些类来减少我用来问问题的时间,这些类正在使用具有相同的属性
  • @NomadMaker 如果他只是创建一个列表复制方法,你会说同样的话。 LSP 并不意味着你不能用相同的方法对不同的类做共同的操作。

标签: java class parsing methods


【解决方案1】:

你有一个经典的方法重载需求

Class A {
    public setupMethod(Car car){
     //do something here
    }


     public setupMethod(House house){
         //do something different here
    }

}

在你调用它的类中,创建一个新对象并调用调用。

main() {
  A a = new A(){
  a.setupMethod(carVariable);
  a.setupMethod(houseVariable);
}

查看此页面以获取更多参考 https://www.w3schools.com/java/java_methods_overloading.asp

【讨论】:

    【解决方案2】:

    万亿有一个好点子。如果您可能修改 Car 和 House 类定义,您可能还需要考虑使用公共接口。例如:

    
    public interface ArrayAdaptable<T> {
        ArrayAdapter<T> getArrayAdapter();
    }
    ...
    public class Car extends ArrayAdaptable<Car>{
        private int yearModel;
        private String brand;
        private int priceModel;
        private int numberModel;
    
        @Override
        public ArrayAdapter<Car> getArrayAdapter() {
            return null; // replace here with actual logic
        }
    }
    

    我不确定这是否适用于您的驱动程序逻辑,所以这只是一个想法。

    【讨论】:

      【解决方案3】:

      您始终可以使用泛型来传递任何类的实例。

      public <T> void doSomething(T val) {
         // now do something with val.
      }
      

      当然,T 可能与您想做的不兼容。因此,您可以在适当的情况下使用边界来约束 T

      public <T extends SomeOtherClass> void doSomething(T val) {
         // now do something with val
      }
      

      如果您需要返回类型 T,则可以在上述每个中将 void 替换为 T

      【讨论】:

        猜你喜欢
        • 2011-03-27
        • 1970-01-01
        • 2020-03-10
        • 2021-12-25
        • 2014-03-24
        • 1970-01-01
        • 1970-01-01
        • 2011-08-06
        • 1970-01-01
        相关资源
        最近更新 更多