通用类接受基本类型和字符串

5

如何创建一个只接受Integer、Long和String类型的通用类型?

我知道我们可以通过以下代码为单个类或通过实现接口来限制类型:

public class MyGenericClass<T> where T:Integer{ }

或者处理整型、长整型,但不包括字符串。

public class MyGenericClass<T> where T:struct 

有没有可能创建一个只接受 Integer、Long 和 String 类型的通用程序?


10
你确定泛型是你想要的吗?泛型通常用于跨越多个领域使用。你究竟想解决什么问题? - Moo-Juice
2
@Moo-Juice 这是面试官问的。我问了需求,他回答说“那是要求” :( - Billa
4
我的回答是:“你做不到,即使你能,它也不会真正通用。最好编写三个独立的类。” - Matthew Watson
2个回答

11

在类声明中,你可能没有限制条件,但可以在静态构造函数中进行一些类型检查:

public class MyGenericClass<T>
{
    static MyGenericClass() // called once for each type of T
    {
        if(typeof(T) != typeof(string) &&
           typeof(T) != typeof(int) &&
           typeof(T) != typeof(long))
            throw new Exception("Invalid Type Specified");
    } // eo ctor
} // eo class MyGenericClass<T>

编辑:

正如Matthew Watson在上面指出的那样,真正的答案是“你不能也不应该这样做”。如果你的面试官认为那是不正确的,那么你可能也不想在那里工作 ;)


能否进行编译时检查?这将限制在运行时。 - Billa
@Billa,不过你可以添加一些额外的接口来减少可能出现的情况,例如 IComparable, IConvertible - Lucero
1
@ChrisSinclair,“never”这个词有点过于绝对了——使用完全信任权限,您可以做各种讨厌的事情,包括创建没有运行构造函数的实例 - Lucero
1
@Lucero 哈哈,说得好。您仍然可以像上面那样应用运行时检查,但这将在编译时提供一些保证,以确保除了愚弄之外一切正常。 - Chris Sinclair
3
这是一个面试问题...谁知道为什么呢? - Chris Sinclair
显示剩余2条评论

2

我建议您使用构造函数来展示哪些值是可接受的,然后将该值存储在对象中。如下所示:

class MyClass
{
    Object value;

    public MyClass(int value)
    {
        this.value = value;
    }

    public MyClass(long value)
    {
        this.value = value;
    }

    public MyClass(string value)
    {
        this.value = value;
    }

    public override string ToString()
    {
        return value.ToString();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接