繁体   English   中英

添加到通用列表的列表<T>

[英]Add to a list of a generic List<T>

假设我有一个List<T> ListOfParts = new List<T> ; 在公共类车里。 我想将一个新的“零件”对象添加到ListOfParts列表中。 我收到以下错误(见下文)。 我究竟做错了什么 ?

public class Car
{
    public List<T> ListOfParts = new List<T>();
      :
      :
}

// Main ...
 Car<Part> myCar = new Car<Part>();
 Part myPart = new Part();
 myCar.ListOfParts.Add(myPart);  // <<< Error here

错误CS1502:System.Collections.Generic.List.Add(T)的最佳重载方法匹配具有一些无效的参数(CS1502)

您必须将您的Car类声明为通用类型:

public class Car<T>
{
    public List<T> listOfParts = new List<T>();
}

这使您可以传递需要在编译时定义的通用类型参数。

声明Car<>变量时要分配的类型将传递给成员listOfParts

Car<Integer> carWithIntegerList;
Car<Owners> carWithOwnersList;
// etc..

注意:

其中一条评论已经说明了这一点:您不应以这种方式这样做。 您应该像这样在类声明列表的泛型类型:

public class Car
{
    public List<Part> listOfParts = new List<Part>();
}

public class Part
{
    // ..
}

public class CustomPart extends Part
{
    // ..
}

// 

Car car = new Car();
car.listOfParts(new Part());
car.listOfParts(new CustomPart());

另外:您可能想将listOfParts私有并listOfParts编写getter函数:

public List<Part> getListOfParts() { 
    return this.listOfParts; 
}

如果您注意到我的会员名使用小写字母。 查看Java的代码约定,以及(请参阅下面的评论) 多态性 ,它解释了为什么添加CustomPart仍然可以正常工作。

我不确定您要做什么,因此我的答案与您尝试以“常规”方式为Car类建模的假设相吻合。 如果那不是您想要的,则此答案可能不适用。

Car类中的零件列表不需要是通用的-汽车没有不同类型的轮胎-它们具有不同型号的轮胎,但它们仍然都是轮胎。 引擎,座椅等也是如此-所有这些组件只是Part子类型。 您可以拥有一个通用的Part类,然后可以从中派生您的专用汽车零件-可能是TireEngine (然后是V4EngineV6Engine ,...)等。

public class Car
{
    public List<Part> ListOfParts = new List<Part>();

    // ...
}

public abstract class Part
{
    // ...
}

public class Tire : Part
{
    // ...
}

// Main ...
Car myCar = new Car ();
Tire myTire = new Tire ();

myCar.ListOfParts.Add ( myTire );

请注意, Part是一个抽象类-仅向汽车添加一个“零件”没有多大意义-汽车实际上是由共享相同方面的特定零件组成的:它们都是零件。

这也不一定是代表汽车的最佳方法(也不一定也很糟糕)-拥有Part -s的开放列表将使执行验证变得困难。 有了一个开放列表,呼叫者可以为应该只有4个的汽车增加7个轮胎,或者当大多数汽车只有1个时增加3个方向盘。

由于该列表可公开访问,因此您的Car实例无法知道其零件列表的更改。 通常最好是防止形成不良数据(防止添加无效项),而不是尝试在事实发生后清除不良数据(遍历列表并计数每个部分,确保每个部分的编号正确)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM