我是从C++模板编程来的,有时会对泛型感到很困惑。由于没有方法专门化,我尝试使用了强制转换。以下是我的资料:
public interface INonGen
{
void Get<T>(ref T value);
}
public interface IGen<U> : INonGen
{
}
public class Gen<U> : IGen<U>
{
private U u;
public void Get<T>(ref T value)
{
if (value is U)
{
value = (T) u;
}
else
throw new Exception();
}
}
这不编译。
有什么办法可以让我做这个演员吗?
我想这样做的原因是:在C++模板中,我会为所支持的类型进行专门化,并创建一个抛出异常的非专门化版本。
其基本思想是:具有泛型方法的非泛型接口。尝试使用正确的类型获取值应该有效,尝试使用错误的类型则可能引发。
我们应该保持类型安全,所以我需要返回一个正确类型的实例/值。对象上的任何快捷方式都是不可接受的,在非泛型接口中约束类型也是不可接受的。
通用实现是为了避免重复。我希望支持多个不同的类型(但只支持一小组类型),但我希望这一点在我实例化一个类时决定(并定义T的含义);我仍然希望非泛型接口允许使用任何t;也就是说,我不希望在接口中显式地显示类型集。
当您将一个对象强制转换为另一个对象时,如果编译器找不到转换,它将报告一个错误。由于这两个类型参数是不受约束的,唯一的选择是使用as
运算符,该运算符在强制转换失败时返回null
而不是抛出invalidcastexception
。要使用作为
,还需要将泛型类型约束为类。
public class Gen<U> : IGen<U>
{
private U u;
public void Get<T>(ref T value)
where T : class
{
if (value is U)
{
value = u as T;
}
else
throw new Exception();
}
}
如果不想添加约束,可以强制转换为object
:
value = (T)(object)u;
但是您的代码中有一个逻辑错误。如果值是u
,什么保证u是t
?例如:
var gen = new Gen<Base>();
gen.Set(new DerivedA()); // sets u;
var b = new DerivedB();
gen.Get(ref b);
在本例中,value是base
,而不是u是derivedb
。转换将在运行时失败。
更新
在阅读了你的一些评论之后,下面是我应该如何设计的:
public interface INonGen
{
object Value { get; }
}
public interface IGen<U> : INonGen
{
}
public class Gen<U> : IGen<U>
{
private U u;
public object Value
{
get { return u; }
}
}
从字典中提取项目时:
double value = (double)dictionary[key].Value;
如果没有运行时转换,将引发invalidcastexception
。很简单,不是吗?
在抽象工厂模式中,我使用泛型。我有一个扩展Serializable的BaseEntity接口,Employee类实现了BaseEntity。在抽象类中,我有一个getJavaObj方法 是一种方法,它接受并返回
本文向大家介绍C# 泛型参数转换,包括了C# 泛型参数转换的使用技巧和注意事项,需要的朋友参考一下 泛型不同参数类型生成的对象是相互独立的。 很多时候,我们希望实现 to = ts 这种操作,为什么?因为看上去它应该如此。 为了达到这个目的,就要解决“泛型参数转换的问题”,这个问题的知识点是in out 泛型变体。老实说,这个问题本身不困难,只是非常不直观,很容易让人忘记。 首先一点,为了实现to
我目前在辅导一个高中生AP Java,她问了我一个关于“双选”的问题。我以前从未听说过这个术语,但显然她的老师希望她在即将到来的期末考试中知道这个术语。 她的老师提供的例子是,如果你想将一个整数转换成一个字符串,你必须执行以下操作才能避免编译器错误: 问题是:你想在现实生活中什么时候这样做? 老师只提供了导致运行时错误的示例。此外,我从来不知道有一个术语,但这样做似乎是个坏主意,因为只有当两种类型
我对Java中的原语类型有一个问题。我使用的是JDK1.6。 如果我有以下信息: 编译器不想编译——它说它“无法从int转换为short”,并建议我转换为,因此: 真的管用。但我的问题是,我为什么要投?a和b的值在-短值范围为{-32768,32767}的范围内。当我想执行操作时,我还需要强制转换-,*,/(我还没有检查其他操作)。 如果我对基元类型执行相同的操作,我不需要将aa bb强制转换为。
本页包含内容: 泛型形参子句 泛型实参子句 本节涉及泛型类型、泛型函数以及泛型构造器的参数,包括形参和实参。声明泛型类型、函数或构造器时,须指定相应的类型参数。类型参数相当于一个占位符,当实例化泛型类型、调用泛型函数或泛型构造器时,就用具体的类型实参替代之。 关于 Swift 语言的泛型概述,见泛型(第二部分第22章)。 泛型形参子句 泛型形参子句指定泛型类型或函数的类型形参,以及这些参数的关联约