【发布时间】:2022-09-23 00:44:00
【问题描述】:
在 Java 中,Class<T> 是通用的,如果我想要一个受约束的参数,这很有用;例如:
public void foo(Class<? extends Comparable<?>> clazz) {
...
}
foo(Integer.class) // OK!
foo(Object.class) // Error - does not implement Comparable<?>
C#的等价物是Type,但它不是通用的,这意味着你不能约束参数;例如:
public void Foo(Type clazz) {
...
}
Foo(typeof(int)) // OK!
Foo(typeof(object)) // OK!
我想一种解决方案可能是将类型作为泛型参数传递;例如:
public void Foo<T>() where T : IComparable<T> {
typeof(T)
}
Foo<int>() // OK!
Foo<object>() // Error - does not implement IComparable<T>
这是唯一的方法,还是有更等同于 Java 方法的方法,换句话说,C# 中是否有类似 Type<T> 的东西?
-
这是唯一的方法。这种方法有什么问题?对我(了解 Java 和 C#)来说,您的第一个和最后一个示例在功能上看起来是相同的。
-
C# 泛型被具体化;这是一个模板系统。在java中它们不是,它是一个编译器检查的文档系统。因此,大量特定于泛型的东西在 C# 和 Java 之间是完全不同的。另外,java\ 的
j.l.Class被泛型这一事实主要是一个无法再修复的错误。有些事情泛型可以表示一个类不能(such asList<String>), and things classes can represent that generics can\'t (such asint.class`)。