添加到通用List <t>的列表中

时间:2015-05-18 20:50:13

标签: c# .net list generics

假设我有List<T> ListOfParts = new List<T>;在班级公共班车里面。我想添加一个新的&#39; Part&#39;对象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)

2 个答案:

答案 0 :(得分:1)

您必须将您的班级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设为私有并为其编写一个getter函数:

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

如果您发现我使用的是小写字母作为会员名称。请查看code conventions for Java以及polymorphism下方的评论(请参阅下面的评论),这解释了为什么添加CustomPart仍然有效。

答案 1 :(得分:0)

我不确定你要做的是什么,所以我的回答是假设您正在尝试在常规&{&#39}中为Car课程建模#39;方式。如果那不是您所追求的,那么这个答案可能并不适用。

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是一个抽象类 - 仅仅添加一个&#39;部分&#39;是没有意义的。汽车 - 汽车真的由特定部件组成,所有部件都有一个共同点:它们是所有部件。

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

由于列表可公开访问,因此您的Car实例无法了解其部件列表的更改。通常最好防止形成不良数据(防止添加无效项目),而不是在事后清除坏数据(通过列表并计算每个部分,确保每个部分都有正确数量) )。