C#泛型是Java中不存在的问题



我很难理解csharp的泛型与Java的泛型相比是如何工作的。

我已经用c#和java 编写了以下示例

java

abstract class Gun { }
class Laser extends Gun { }
class Flamethrower extends Gun { }
abstract class GunConfig<T extends Gun> { 
public T gun;
}
class LaserConfig extends GunConfig<Laser> { }
class FlamethrowerConfig extends GunConfig<Flamethrower> { }
public class MyClass {
public static void main(String args[]) {
GunConfig[] configs = new GunConfig[2];

configs[0] = new FlamethrowerConfig();
configs[1] = new LaserConfig();

System.out.println(configs[0]);
System.out.println(configs[1]);
}
}

csharp

abstract class Gun { }
class Laser : Gun { }
class Flamethrower : Gun { }
abstract class GunConfig<T> where T : Gun { 
public T gun;
}
class LaserConfig : GunConfig<Laser> { }
class FlamethrowerConfig : GunConfig<Flamethrower> { }
public class Program
{
public static void Main()
{
GunConfig<Gun>[] configs = new GunConfig<Gun>[2];

configs[0] = new FlamethrowerConfig();   // <--- Cannot implicitly convert 'FlamethrowerConfig' into 'GunConfig<Gun>'
configs[1] = new LaserConfig();
Console.WriteLine(configs[0]);
Console.WriteLine(configs[1]);
}
}

在将泛型类型添加到GunConfig类之前,我有这样的

abstract class GunConfig { 
public Gun gun;
}
class LaserConfig : GunConfig { 
public void DoSomething() {
var laser = (Laser)gun;
}
}

我只是简单地将基本的Gun实例强制转换为我的类应该使用的任何实例,这样你就可以有一个LaserConfig实例,里面有另一种类型的基于Gun的实例,这会使强制转换失败。

您可以添加另一个非泛型GunConfig类并从中派生GunConfig<T>,以避免集合类型参数问题。额外的类在集合之外并不真正需要,但实际上只需要一两行代码,这有点烦人。

abstract class Gun { }
class Laser : Gun { }
class Flamethrower : Gun { }
abstract class GunConfig { // this resolves the type mismatch issue
}
abstract class GunConfig<T> : GunConfig where T : Gun { 
public T gun;
}
class LaserConfig : GunConfig<Laser> { }
class FlamethrowerConfig : GunConfig<Flamethrower> { }
public class Program
{
public static void Main()
{
GunConfig[] configs = new GunConfig[2];

configs[0] = new FlamethrowerConfig();   // no error now
configs[1] = new LaserConfig();
Console.WriteLine(configs[0]);
Console.WriteLine(configs[1]);
}
}

最新更新