当前位置: 首页 > 面试题库 >

C#相当于Java的通配符

松桐
2023-03-14
问题内容

如果存在,则以下Java代码的C#等效项是什么:

new HashMap<Class<? extends BaseClass>, Integer>();

我目前使用new Dictionary<Type, int>(),这更像
new HashMap<Class<?>, Integer>()是明显不同。

(忽略之间的差异HashMapDictionary

编辑: 为澄清起见,我不尝试定义新类,只需创建HashMap/ 的实例Dictionary


问题答案:

C#中没有Java通配符。在Java中,类型类型是Class<T>其中T的类本身。C#中的等效项是类型Type,它 不是泛型的
。因此,您似乎最好的办法就是拥有一个Dictionary<Type, int>,如果将其封装在一个类中,则可以限制您在代码中放入字典的内容(因此,这只是运行时检查):

private Dictionary<Type, int> myDictionary = new Dictionary<Type, int>();
public void Add(Type type, int number) {
   if (!typeof(BaseClass).IsAssignableFrom(type)) throw new Exception();
   myDictionary.Add(type, number);
}

您甚至可以IDictionary使用该逻辑来实现自己的逻辑。

更新

我可以想到的另一个 运行时 技巧是为您的类型使用包装器类:

public class TypeWrapper<T>
{
    public Type Type { get; private set; }
    public TypeWrapper(Type t)
    {
        if (!typeof(T).IsAssignableFrom(t)) throw new Exception();
        Type = t;
    }
    public static implicit operator TypeWrapper<T>(Type t) {
        return new TypeWrapper<T>(t);
    }
}

(也可以执行EqualsGetHashCode,仅委托给Type。)

然后您的字典变成:

var d = new Dictionary<TypeWrapper<BaseClass>, int>();
d.Add(typeof(BaseClass), 2);
d.Add(typeof(Child), 3);


 类似资料:
  • 问题内容: 我知道您可以使用lock在c#中锁定对象,但是可以放弃该锁并等待其他东西来通知您它已更改,就像您可以在Java中使用wait和notify一样吗? 在我看来,分别在Java和C#中同步和锁定是同义的。 问题答案: 等效功能(包括常规锁定)在Monitor类中。 C#中的语句等效于调用并带有适当的try / finally块。 有关更多详细信息,请参见我的线程教程或Joe Albahar

  • 问题内容: 我正在寻找Java ByteBuffer的“ C ++”。 我可能会丢失明显的内容,或者仅需要一个孤立的用法示例进行澄清。我浏览了iostream家族,它似乎可以提供基础。具体来说,我希望能够: 从字节数组/点构建缓冲区,并从缓冲区获取原语,例如getByte,getInt 使用原语(例如putByte,putInt)构建缓冲区,然后获取字节数组/指针。 问题答案: 您已经拥有,或者可

  • 问题内容: Java是否具有表示一段时间的数据类型,例如34秒,5分钟等。 我已经看到了一些TimeSpan的实现,这些实现涵盖了从12月10日到12月11日这样的时间段。 我需要的是类似C#中的TimeSpan。 问题答案: 目前还不是JDK的一部分,但是将被合并到JDK 7中-尝试Joda Time

  • 问题内容: 从Java世界进入C#,是否有等效的HashMap?如果没有,您会推荐什么? 问题答案: 可能是最接近的。实现接口(类似于Java的接口)。 您应该注意一些明显的区别: 添加/获取项目 Java的HashMap具有用于设置/获取项目的和方法 C#的词典使用索引来设置/获取项目 键 Java 允许空键 如果您尝试添加空键,.NET会引发 添加重复密钥 Java 将用新值替换现有值。 如果

  • 问题内容: 我正在寻找具有C ++ std :: map的通常实现特征的Java类(据我了解,这是一个自平衡二进制搜索树): 插入/删除/搜索的O(log n)性能 每个元素均由唯一键和映射值组成 按键遵循严格的弱顺序 我正在寻找带有开源或设计文档的实现;我可能最终会放弃对原始键/值的支持。 这个问题的风格类似于:std :: deque的Java等效 ,其答案是“ Java Primitive

  • 问题内容: C#中的Java枚举相当于什么? 问题答案: 完整的Java枚举功能在C#中不可用。你可以来 合理地 接近使用嵌套类型和私有构造虽然。例如: 当然你不 具备 使用嵌套类型,但他们给了方便的“自定义的行为”其中一部分的Java枚举是好的。在其他情况下,您可以仅将参数传递给私有构造函数以获取众所周知的受限值集。 一些不能给您的事情: 顺序支持 开关支持 序列化/反序列化(作为单例) 尽管没