【问题标题】:Does C# have a generic equivalent of Java's Class<T>?C# 是否具有 Java 的 Class<T> 的通用等价物?
【发布时间】:2022-09-23 00:44:00
【问题描述】:

在 Java 中,Class&lt;T&gt; 是通用的,如果我想要一个受约束的参数,这很有用;例如:

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&lt;T&gt; 的东西?

  • 这是唯一的方法。这种方法有什么问题?对我(了解 Java 和 C#)来说,您的第一个和最后一个示例在功能上看起来是相同的。
  • C# 泛型被具体化;这是一个模板系统。在java中它们不是,它是一个编译器检查的文档系统。因此,大量特定于泛型的东西在 C# 和 Java 之间是完全不同的。另外,java\ 的j.l.Class 被泛型这一事实主要是一个无法再修复的错误。有些事情泛型可以表示一个类不能(such as List<String>), and things classes can represent that generics can\'t (such as int.class`)。

标签: java c#


【解决方案1】:

Foo&lt;T&gt;() 方法是 C# 中唯一的一种。

Java 方法是仅编译时(类型擦除)泛型的解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多