为什么泛型类型在方法签名中出现两次
本文关键字:两次 泛型类型 方法 为什么 | 更新日期: 2023-09-27 18:00:29
为什么我们需要在以下方法中使用两次类型
public void Search<T>(T bo) { }
我们可以申报吗
public void Search(T bo){}.
找不到这个答案?请帮忙。
提前感谢。
在片段中:
public void Search<T>(T bo);
<T>
指定存在一个名为T
的类型参数。然后,T bo
指定有一个类型为T
的参数,该参数将在方法内部称为bo
。
如果不包含<T>
部分,编译器就无法知道bo
是一个泛型参数,而不仅仅是一个名为T
的类的实例。
如果你知道以下内容实现了完全相同的效果,这可能会让你更容易理解:
public void Search<Something>(Something bo);
如果<Something>
部分被排除在外,那么这与采用Something
:类实例的普通方法没有什么区别
public void Search(Something bo);
回答您的第二个问题:
仅仅拥有
public void Search(<T> bo)
难道没有意义吗?
这不起作用,因为泛型类型不一定使用参数。也不一定是返回类型。它可能根本不会出现在方法签名的其他位置。一个微不足道的例子可能是:
public bool IsType<T>(object input)
{
return input.GetType() == typeof(T);
}
在这种情况下,type参数是绝对必要的。在某些情况下,可能会使用您建议的语法来推断它,但这会导致不同情况下的各种不一致。
编译器怎么可能知道T
是一个泛型参数或类型?你不能有一个名为T
的类或结构吗?那么,编译器应该如何处理这种情况呢?
考虑一下:
class Foo { }
static void DoSomething(Foo f) { }
在这种情况下,DoSomething
应该是通用还是非通用
需要避免歧义,因为T
本身就是一个有效的a类型。假设您写道:
Search(T bo){}
在其他地方:
public class T { }
编译器必须将T
解释为对类T
的引用,而不是对泛型类型参数的引用。
方法(或类)名称后的<T>
标识T
不是普通类名,而是此方法(或类别)的上下文中的泛型类型参数。
当您执行此时
public void Search(T bo){}.
它说T
是一个输入参数,但没有说什么是T
,有一个令人震惊的类名T
是完全可以的。因此,下面我们向编译器说明T
是一个泛型参数。
public void Search<T>(T bo) { }
还要注意,当您在泛型类中时,您可以作为version1执行操作。例如
class Test<T>
{
public void Search(T bo){}.
}
这是完全合法的。因为我们知道T是一个泛型参数,在构造类时应该提供它。