1
public void AddEmployee<T> (T employee) where T : Employee
{

  //some code here


 }

但是如果我这样写

public void AddEmployee (Employee Employee)
{
 // Code here
}

相似地,

public class GenericList<T> where T : Employee

public class GenericList<Employee> 

我看不出两者有什么区别。我知道当有接口作为派生约束时

public class GenericList<T> where T : IComparable, IConvertible 

但是如果使用子类(如上面的员工),那对我来说没有意义。我在这里错过了什么吗?请解释

4

2 回答 2

6

不同之处在于它List<Employee>可以保存任何实例Employee或其子类之一,而 aList<T> where T : Employee可能更具限制性。

这是因为泛型类型T可以是 的任何子类Employee,在这种情况下,列表只能包含 的子类的实例T,而不能包含任何Employee实例。

例如,给定

public class Manager : Employee
{
}

aList<Manager>只能保存管理器,不能保存Employee基类的实例或Employee.

相反,您可以将EmployeeManager实例都放入List<Employee>

于 2013-05-25T11:26:56.687 回答
3

关于课程

这个问题与以下问题大致相同:非​​泛型ArrayList和泛型之间有什么区别List<T>。由于 ArrayList 接受任何类型的数据(都是来自基类的服务object,因此很容易将数据取出。

有一个很大的缺点:当您从 中提取数据时ArrayList,您必须将其转换回其原始数据类型。

在你的例子中,同样的事情。假设您有一个经理班:

public class Manager : Employee {}

你创建到列表:

public class MyList: List<Emplyoyee> {}
public class MyList<T>: List<T> where T : Employee {}
...
MyList myList1 = ...;
MyList<Employee> myList2 = ...;

myList1和willa 都myList2接受Employee实例和Manager实例。到目前为止没有区别。(这与比较ArrayList和相同List<object>。)

但现在试试这个:

MyList myList1 = ...;
MyList<Manager> myList2 = ...;

两个列表都接受该Manager类型的实例。但myList1也只接受 type 的实例Employee。如果您想从您那里检索经理,myList1您可能需要强制转换它(性能下降)。myList2仅限于接受经理(和衍生品)。

简而言之:MyList可以用于任何 Employee-derivative 并且不像MyList<T>. MyList<T>只要它派生自 ,就可以恢复为任何类型Employee。它

如果您不打算为经理制定专门的清单,那么在这种情况下不会有任何区别。

关于方法

您的方法示例都有点相同。让我们用一些其他的例子来演示使用:

void DoSomething1(object value) {};
void DoSomething2<T>(T value) {};

两种方法都接受 ANY 参数。例外,如果您将值类型用于DoSomething1,则该值将被装箱。拳击是一种性能损失。DoSomething2会根据自己的类型进行调整。因此:

DoSomething1(123); // <-- Will box the int.
DoSomething2(123); // <-- Will NOT box the int.

另一个例子:

object Copy1(object value) {};
T Copy2<T>(T value) {};

两种方法都会复制参数并将其返回(如何,现在无关紧要)。在第一个示例中,object返回 an。如果您想使用该副本,则必须先投射它。也许拆箱。两者性能损失。在第二个 Copy 方法中,您总是得到与参数相同类型的返回值。因此:

int copy1 = (int)Copy1(123); // <-- Will box the int, and the copy needs to be unboxed.
int copy2 = Copy2(123); // <-- Will NOT box the int, and the copy does NOT need to be unboxed or casted.

在您的情况下,当您仅使用作为引用类型而不是返回类型的输入参数时,它不会有太大的不同(关注性能)。

于 2013-05-25T11:39:13.553 回答