不是Java的粉丝,但Java不允许为泛型类设置类型,在这种情况下,它会将类型威胁为Object类型.但是,据我所知,C#强制设置<T>通用类必须实例化或简单使用时的类型.但是,假设我们有一个泛型类,我们需要一个不依赖于类型的静态方法<T>.
首先,我们知道它可以移动到一个单独的上下文,或者我们可以设置一个虚拟类型<T>,但作为一个编程难题,有没有办法调用它而不定义类型T?
例:
class Test<T> where T: ITestable {
...
public static void CreateTestFile(String fileName) {...}
}
Test.CreateTestFile("test.txt");
Run Code Online (Sandbox Code Playgroud)
这可以用Java完成,显然不能用C#.但我只是想确定一下.
Java和C#以不同方式实现泛型:
Java使用类型擦除,这基本上意味着在编译时,您放入的任何内容都会<T>被删除并变为Object.Something<Foo>并且Something<Bar>在运行时将是相同的类型,并且将有效地等于Something<Object>.
C#使用运行时具体化,这意味着对于使用不同类型的每种类型T,运行时通过使用开放通用版本作为模板完全生成一个新类(这意味着它也会在T您调用时生成一次底层本机代码它).就CLR而言Something<Foo>,Something<Bar>它们是两种不相关的类型.
希望你理解为什么这种差异对你的场景很重要.忽略T在Java中是微不足道的,但在C#中并不那么容易.
如果您T的代码中不需要,则使用非泛型方法:
abstract class Test
{
public static void CreateTestFile(String fileName) {...}
}
class Test<T> : Test
where T : ITestable
{
...
}
Run Code Online (Sandbox Code Playgroud)
在这里,那更好:)
另外,请注意,例如方法,您可以使用协变和逆变接口来放松T编译时已知的要求.例如,如果使用协变接口,则只需要知道基本类型T.
| 归档时间: |
|
| 查看次数: |
648 次 |
| 最近记录: |