Java Generics: Как избежать беспорядка в заголовке класса - PullRequest
0 голосов
/ 24 октября 2019

Я работаю с java-генериками и хочу избежать путаницы в заголовках классов.

// The car saves a generic list
class Car<L>{
 ArrayList<L> exampleList=new ArrayList();

 public void ArrayList<L> getExampleList(){
    return exampleList;
 }
}


class Mercedes extends Car<Engines> ...
class Porsche extends Car <Wheels>... 


class Warehouse<T extends Car>{
    T car;

    // I want to work with a generic List here
    public void useListFromCar(){
          // This returns a simple ArrayList but not a ArrayList<L> 
          car.getExampleList();

    }
}


Мне нужно иметь возможность работать с общим списком, а не только с ArrayList. Единственный известный мне способ решения этой проблемы приводит к путанице в заголовках моего класса. Также это будет избыточная информация в заголовке. Конкретный детский автомобиль уже знает тип Списка. Почему Склад должен знать об этом.

// Redundant and messy header :(
class Warehouse<L, T extends Car<L>>{
    T car;


    public void useListFromCar(){
          // This returns the desired ArrayList<L> 
          car.getExampleList();

    }
}

Я думаю, вы можете себе представить, что это становится совершенно неуправляемым с большими классами. Есть ли способ избежать этого?

1 Ответ

0 голосов
/ 24 октября 2019

способ, которым вы сделали, не имеет проблемы. проблема в том, как вы это абстрагируете:

почему автомобили имеют универсальный тип, такой как Двигатели, Колесо для другой марки? Двигатели и Колеса - автомобильные компоненты. Вы можете написать несколько интерфейсов с именами Engine, Wheel и реализовать их конкретные классы. в вашем классе автомобилей, он должен содержать эти компоненты. и универсальный тип может быть фирменным знаком. все коды генерируются из здравого смысла реального мира. если вы напишите что-то, что не имеет смысла, то это наверняка будет в беспорядке.

вот разумный пример:

interface Car<L>{
     List<Wheel> wheels;
     Engine engin;
       //get set method
}

interface Wheel{
    String getBrand();
    String getquality();
...
}
interface Engine{
    String getHorsePower();
    String getSize();
...
}
class MuscleCar implements Car<Mercedes>{
...
}
class RacingCar implements Car<Mercedes>{
...
}




class Warehouse<T extends Car>{
    List<T> cars;

    // I want to work with a generic List here
    public void useListFromCar(){
          // This returns a simple ArrayList but not a ArrayList<L> 
         for(T car: cars){
           car.getBrand();
           car.getType();
           car.getEngine(); //etc..
        }
    }
}
...