没有得到泛型的类型安全性以及何时使用泛型

本文关键字:泛型 安全性 何时使 类型安全 类型 | 更新日期: 2023-09-27 18:28:17

我不清楚之间的区别

public class MyVehicleCollection<T> where T : Vehicle
{
     private List<T> listofVehicles = new List<T>();
     public void AddVehicle(T v) { listofVehicles.Add(v); }
}

public class MyVehicleCollection<Vehicle>
{
     private List<Vehicle> listofVehicles = new List<Vehicle>();
     public void AddVehicle(Vehicle v) { listofVehicles.Add(v); }
}

我不明白为什么在这两种情况下都只能将衍生自Vehicle的类型添加到集合中。我也不明白为什么我需要创建额外的集合类来包含非通用情况下的摩托车:车辆。

非常感谢。

没有得到泛型的类型安全性以及何时使用泛型

您的第二个表单根本没有绑定到车辆:

public class MyVehicleCollection<Vehicle>
{
}
...
var coll = new MyVehicleCollection<string>();

从你的描述来看,你似乎根本不需要泛型。

public class MyPlainVehicleCollection  //<Vehicle>  no Type Parameter
{
     private List<Vehicle> listofVehicles = 
             new List<Vehicle>();  // class Vehicle
     public void AddVehicle(Vehicle v) { listofVehicles.Add(v); }
}

也不明白为什么我需要为包含Motobike : Vehicle

你没有:

var garage = new MyPlainVehicleCollection();
garage.Add(new Motobike ());

您通常会使用它来强制类所接受的类型,只要它们是从Vehicle派生的。

如果你有

class Truck : Vehicle {}

class Van : Vehicle {}

您可以申报

var x = new MyVehicleCollection<Truck> ();

那么以下情况将导致编译器错误:

x.AddVehicle ( new Van () );

两者之间的区别不是在运行时,而是在编译时。

在第一种情况下,您只能使用Vehicle或从Vehicle派生的类型声明MyVehicleCollection。

在第二种情况下,您可以用任何类型声明MyVehicleCollection,正如@Henk Holterman所说。

我认为您不仅应该考虑类声明,还应该考虑方法(可能是,这样会更清楚)

//somewhere in the code have a method
public static string GetVehicleName<T>(T vehicle)  where T : Vehicle, new()
{
    return vehicle.GetVehicleName();
}
//abstract class Vehicle
public abstract class Vehicle
{
    public abstract string GetVehicleName ();
}
//Child class 
public class Car : Vehicle
{  
   public override string GetVehicleName()
   {
     return "Car";
   }
}

使用后,就像一样

GetVehicleName(new Car()); //will return "Car"

这不是一个可用于生产的代码,只是一个示例,希望能给你一个想法。

它基本上为一个函数创建和抽象层,该函数可以托管任何类型的Vehicles

希望这能有所帮助。

您的示例不一定显示出好处。例如,您创建了一种包含子列表的超新型数据结构:

public SuperFastForwardOnlyList<T> : where T : IEnumerable
{
    public void AddList(T childList);
    //Crazy new algorithm here that is going to earn you a fortune, but must use collections     
    //of the same type.
}

然后,您可以将其用于任何类型的枚举,确保它满足算法的约束:

SuperFastOnlyList<IList> listOfLists = new SuperFastOnlyList<IList>();
listOfLists.Add(new List());  //Fine
listOfLists.Add(new object()); //Whoops - compile time error.

这个例子也有点做作,但可能更具启发性?