例如,有两个方法看起来很普通,但问题是它们是否可以这样调用:
// Обобщенный тип с неявным указанием типа, и соответственно
// так писать можно(никаких синтаксическим ошибок в коде нет)
void Method(T arg);
等等
void Method<T>(T arg); // Обобщенный тип с явным указанием типа
也就是说,事实上,这两种方法是相同的(因此,是Generics,还是完全相同,在第一种情况下,我们不能说该方法是通用的(尽管它有一个参数化参数)?
UPD
我忘了澄清一点,即上述方法在通用接口或类中,即
interface IFly<T>
{
void Method<T>(T arg); //так
void Method(T arg); // или так
}
如果你有这样的代码:
这里 T 的第二个声明覆盖了第一个。实际上,您提供的代码等效于以下内容:
通常这样的重叠是错误的,因为出于某种原因声明了类型参数。例如,由于类型不匹配,下面的代码将无法编译:
顺便说一下,两个级别的标识符重叠不是限制。不要这样做:
在上面的示例中,所有 4 个字母 T 代表不同的类型。
广义的可以是:
在第一种情况下,只有当方法所属的类本身是通用的并且包含占位符(类型参数)T 时,我们才能指定它:
在第二种情况下,您有一个通用方法:
如果将与类同名的自定义占位符添加到泛型类中的方法中,这会导致混淆并使代码难以阅读。
让我们上课
MyGenericClass。我们可以创建它的对象并调用方法:在这种情况下,该方法将按我们预期的那样工作。只
int传给方法是行不通的,否则会出现编译时错误。现在我们另外参数化方法本身:
该方法的行为并不明显: