假设我有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)
答案 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
课程,然后您可以从中推导出您的专用汽车零件 - 可能是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
是一个抽象类 - 仅仅添加一个&#39;部分&#39;是没有意义的。汽车 - 汽车真的由特定部件组成,所有部件都有一个共同点:它们是所有部件。
这也不一定是代表汽车的最佳方式(它也不一定也不错) - 拥有Part
- s的开放列表会使执行验证变得困难。通过打开列表,呼叫者可以为汽车添加7个轮胎,当大多数汽车只有1个时,应该只有4个或增加3个方向盘。
由于列表可公开访问,因此您的Car
实例无法了解其部件列表的更改。通常最好防止形成不良数据(防止添加无效项目),而不是在事后清除坏数据(通过列表并计算每个部分,确保每个部分都有正确数量) )。