泛型类型参数是实现接口的类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了泛型类型参数是实现接口的类相关的知识,希望对你有一定的参考价值。

假设我们有一个实现接口的类

class MyParaClass : IMyParaInterface

另一个名为MyObject的类采用泛型T.

class MyObject<T> where T: IMyParaInterface

现在我有一个接受此参数的方法

Print(MyObject<IMyParaInterface> parameter)

当我得到一个类型为MyObject<MyParaClass>的对象,并尝试将其传递给Print方法时,Build失败,因为它无法将MyObject<MyParaClass>转换为MyObject<IMyParaInterface>

我认为应该没有问题,因为MyParaClass实施IMyParaInterface。如何解决这个问题或绕过?

答案

您应该将Print方法定义为模板方法:

void Print<T>(MyObject<T> parameter) where T : IMyParaInterface {}

这意味着,该方法将采用任何MyObject <>实例,其类型参数实现您的IMyParaInterface接口。

原始Print()代码的问题是,它只接受MyObject <IMyParaInterface>作为输入。注意,MyObject <MyParaClass>不是MyObject <IMyParaInterface>类型的实例。

还有另一种解决方案,您可以使用.net的协方差/逆变量功能,为您的对象定义一个接口,其中类型参数将被标记为协变(输出T)。

public interface IMyObject<out T> where T: IMyParaInterface {}

public class MyObject<T> : IMyObject<T> where T: IMyParaInterface {}


public static void Print(IMyObject<IMyParaInterface> parameter)  {}

在这种情况下,MyObject <MyParaClass>将与IMyObject <IMyParaInterface>类型兼容。

你可以在这里阅读协方差/逆变:https://docs.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance

以上是关于泛型类型参数是实现接口的类的主要内容,如果未能解决你的问题,请参考以下文章

泛型反射

java11-泛型及其使用

泛型约束

Java 之 泛型擦除

泛型的类,接口和方法

《Effective Java》第5章 泛型