Java泛型:如何避免类头混乱

Java泛型:如何避免类头混乱,java,generics,inheritance,wildcard,Java,Generics,Inheritance,Wildcard,我正在使用java泛型,我希望避免类头中出现混乱 //汽车会保存一个通用列表 班车{ ArrayList exampleList=新建ArrayList(); public void数组列表getExampleList(){ 返回示例列表; } } 奔驰级轿车。。。 类保时捷扩展车。。。 类仓库{ T车; //我想在这里使用一个通用列表 公共无效useListFromCar(){ //这将返回一个简单的ArrayList,但不返回ArrayList getExampleList(); } }

我正在使用java泛型,我希望避免类头中出现混乱

//汽车会保存一个通用列表
班车{
ArrayList exampleList=新建ArrayList();
public void数组列表getExampleList(){
返回示例列表;
}
}
奔驰级轿车。。。
类保时捷扩展车。。。
类仓库{
T车;
//我想在这里使用一个通用列表
公共无效useListFromCar(){
//这将返回一个简单的ArrayList,但不返回ArrayList
getExampleList();
}
}
我需要能够使用通用列表,而不仅仅是ArrayList。我所知道的解决这个问题的唯一方法是在我的类标题中造成混乱。此外,它将是标题中的冗余信息。特定的子车已经知道列表的类型。为什么仓库需要知道这些

//冗余且混乱的标题:(
类仓库{
T车;
公共无效useListFromCar(){
//这将返回所需的ArrayList
getExampleList();
}
}

我想您可以想象,对于更大的类,这变得非常难以管理。有什么方法可以避免这种情况吗?

您所采用的方法没有问题。 问题在于你对它的抽象方式:

为什么汽车有通用类型,如发动机、车轮等不同品牌? 发动机和车轮是汽车的部件。 您可以编写几个名为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..
        }
    }
}
接口车{
列表轮;
发动机;
//获取集方法
}
接口轮{
字符串getBrand();
字符串getquality();
...
}
接口引擎{
字符串getHorsePower();
字符串getSize();
...
}
马斯克莱卡类工具车{
...
}
类赛车{
...
}
类仓库{
列出车辆清单;
//我想在这里使用一个通用列表
公共无效useListFromCar(){
//这将返回一个简单的ArrayList,但不返回ArrayList
对于(T车:车){
car.getBrand();
car.getType();
car.getEngine();//等。。
}
}
}

实际上,由于类型擦除,
仓库
中的
汽车
对象不知道类型
L
。您真的需要为每种特定类型的汽车建立仓库吗?在您的示例中,您不使用“
L
-ness”这是一个虚构的例子。事实上,我有一个抽象的视图模型和一个遵循Android MVVM模式的抽象存储库。因此,我确实需要为每种特定类型的存储库指定一个特定的视图模型。除非你让你的例子非虚构到足以让我们看到你在尝试做什么,否则我不会很难给出一个具体的答案。我在Repo中有一个LiveData保存一个自定义的泛型数据。我需要处理这些泛型数据。这几乎就是我的具体案例的全部内容。这是一个虚构的例子,有一个原因……我知道它不能描述真实世界。