- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
不是 Java 的粉丝,但 Java 不允许为泛型类设置类型,在这种情况下,它会威胁类型为 Object
类型。但是,据我所知,C# 强制设置 <T>
的类型任何时候必须实例化通用类或简单地说使用。但是,假设我们有一个泛型类,我们需要一个不依赖于 <T>
类型的静态方法。 .
首先,我们知道它可以移动到一个单独的上下文中,或者我们可以设置一个虚拟类型 <T>
, 但作为一个编程难题,有什么方法可以调用它 而无需定义 T
的类型
?
例子:
class Test<T> where T: ITestable {
...
public static void CreateTestFile(String fileName) {...}
}
Test.CreateTestFile("test.txt");
这可以在 Java 中完成,显然不能在 C# 中完成。但我只是想确定一下。
最佳答案
Java 和 C# 实现泛型的方式不同:
Java 使用类型删除,这基本上意味着在编译时,您放入<T>
中的任何内容。被删除并变为 Object
. Something<Foo>
和 Something<Bar>
在运行时将是相同的类型,并且实际上等于 Something<Object>
.
C# 使用运行时具体化,这意味着您使用的每种类型都有一个不同的 T
,运行时通过使用开放通用版本作为模板,完全生成一个新类(这意味着它还会根据您所说的 T
生成一次底层 native 代码)。 Something<Foo>
和 Something<Bar>
就 CLR 而言,它们是两个不相关的类型。
希望您理解为什么这种差异对您的场景很重要。忽略 T
在 Java 中很简单,但在 C# 中就不那么容易了。
如果你不需要T
在您的代码中,然后使用非泛型方法:
abstract class Test
{
public static void CreateTestFile(String fileName) {...}
}
class Test<T> : Test
where T : ITestable
{
...
}
在这里,那更好:)
另请注意,对于实例方法,您可以使用协变 和逆变 接口(interface)来放宽对已知 T
的要求。在编译时。例如,如果你使用一个协变接口(interface),你只需要知道 T
的基类型。 .
关于c# - 为泛型类中的静态方法设置无类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34833212/
我是一名优秀的程序员,十分优秀!