[英]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
类,然后可以从中派生您的专用汽车零件-可能是Tire
, Engine
(然后是V4Engine
和V6Engine
,...)等。
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.