java限制数字_是否存在将我的通用方法限制为数字类型的约束?
谁能告诉我泛型是否可以将泛型类型参数T限制为:
Int16
Int32
Int64
UInt16
UInt32
UInt64
我知道where关键字,但是找不到仅适用于这些类型的接口,
就像是:
static bool IntegerFunction(T value) where T : INumeric
#1楼
这个问题有点像是一个常见问题,所以我将其发布为Wiki(因为我之前发布过类似的文章,但这是一个较旧的问题); 无论如何...
您正在使用什么版本的.NET? 如果您使用的是.NET 3.5,那么我在MiscUtil (免费等)中有一个通用的运算符实现 。
它具有T Add(T x, T y) ,以及用于不同类型(如DateTime + TimeSpan )的其他算术变体。
此外,这适用于所有内置,提升和定制的运算符,并缓存代表以提高性能。
为什么这是棘手的一些其他背景在这里 。
您可能还想知道dynamic (4.0)排序也间接解决了此问题-即
dynamic x = ..., y = ...
dynamic result = x + y; // does what you expect
#2楼
.NET数字基元类型不共享任何允许它们用于计算的通用接口。 可以定义自己的接口(例如ISignedWholeNumber ),该接口将执行此类操作,定义包含单个Int16 , Int32等的结构并实现这些接口,然后具有接受约束到ISignedWholeNumber泛型类型的方法,但具有将数值转换为您的结构类型可能会很麻烦。
一种替代方法是使用静态属性bool Available {get;};定义静态类Int64Converter bool Available {get;}; 以及Int64 GetInt64(T value) , T FromInt64(Int64 value) , bool TryStoreInt64(Int64 value, ref T dest)静态委托。 该类的构造函数可以使用硬编码来加载已知类型的委托,并可以使用Reflection来测试T类型是否使用正确的名称和签名来实现方法(如果它像包含Int64并表示数字的结构那样,但具有自定义的ToString()方法)。 这种方法将失去与编译时类型检查相关的优势,但是仍然可以避免装箱操作,并且每种类型仅需“检查”一次。 之后,与该类型关联的操作将被委托分派替换。
#3楼
我创建了一些库功能来解决这些问题:
代替:
public T DifficultCalculation(T a, T b)
{
T result = a * b + a; // <== WILL NOT COMPILE!
return result;
}
Console.WriteLine(DifficultCalculation(2, 3)); // Should result in 8.
您可以这样写:
public T DifficultCalculation(Number a, Number b)
{
Number result = a * b + a;
return (T)result;
}
Console.WriteLine(DifficultCalculation(2, 3)); // Results in 8.
#4楼
我会使用一种通用的,您可以处理外部性...
///
/// Generic object copy of the same type
///
/// The type of object to copy
/// The source object to copy
public T CopyObject(T ObjectSource)
{
T NewObject = System.Activator.CreateInstance();
foreach (PropertyInfo p in ObjectSource.GetType().GetProperties())
NewObject.GetType().GetProperty(p.Name).SetValue(NewObject, p.GetValue(ObjectSource, null), null);
return NewObject;
}
#5楼
考虑到这个问题的普遍性以及这种功能背后的兴趣,我很惊讶地看到还没有涉及T4的答案。
在这个示例代码中,我将演示一个非常简单的示例,说明如何使用功能强大的模板引擎来完成编译器在泛型背后的工作。
您无需花钱,也不必牺牲编译时的确定性,您只需为所需的每种类型生成所需的函数,然后相应地使用它即可(在编译时!)。
为此:
创建一个名为GenericNumberMethodTemplate.tt的新文本模板文件。
删除自动生成的代码(您将保留其中的大部分,但不需要其中的一部分)。
添加以下代码段:
typeof(Int16), typeof(Int32), typeof(Int64),
typeof(UInt16), typeof(UInt32), typeof(UInt64)
};
#>
using System;
public static class MaxMath {
#>
public static Max ( val1, val2) {
return val1 > val2 ? val1 : val2;
}
} #>
}
而已。 现在完成了。
保存此文件将自动将其编译为该源文件:
using System;
public static class MaxMath {
public static Int16 Max (Int16 val1, Int16 val2) {
return val1 > val2 ? val1 : val2;
}
public static Int32 Max (Int32 val1, Int32 val2) {
return val1 > val2 ? val1 : val2;
}
public static Int64 Max (Int64 val1, Int64 val2) {
return val1 > val2 ? val1 : val2;
}
public static UInt16 Max (UInt16 val1, UInt16 val2) {
return val1 > val2 ? val1 : val2;
}
public static UInt32 Max (UInt32 val1, UInt32 val2) {
return val1 > val2 ? val1 : val2;
}
public static UInt64 Max (UInt64 val1, UInt64 val2) {
return val1 > val2 ? val1 : val2;
}
}
在您的main方法中,您可以验证自己具有编译时确定性:
namespace TTTTTest
{
class Program
{
static void Main(string[] args)
{
long val1 = 5L;
long val2 = 10L;
Console.WriteLine(MaxMath.Max(val1, val2));
Console.Read();
}
}
}
我先说一句话:不,这不违反DRY原则。 DRY原则是为了防止人们在多个地方复制代码,这将导致应用程序变得难以维护。
这里根本不是这种情况:如果您想进行更改,则只需更改模板(您这一代人的一个单一来源!)就可以完成。
为了将其与您自己的自定义定义一起使用,请在生成的代码中添加一个名称空间声明(确保它与定义自己的实现的声明相同),并将该类标记为partial 。 然后,将这些行添加到模板文件中,以便将其包括在最终的编译中:
老实说:这很酷。
java限制数字_是否存在将我的通用方法限制为数字类型的约束?相关推荐
- java不输出数字_为什么我的代码不输出(仅)数字?
代码的运动提示:编写一个程序,告诉你给出的任何金额从1美分到99美分 . 使用25美分(四分之一),10美分(一分钱)和1美分(便士)的硬币面额 . 不要使用镍和半美元硬币 . 您的程序将使用以下函数 ...
- 小程序转换纯数字数字_低代码,快速的应用程序开发和数字转换
小程序转换纯数字数字 最近,许多低码/无码解决方案在企业中得到了发展,使非技术人员可以选择创建简单的应用程序. 分析人士预测,低码行业将以每年20%以上的速度增长. 但是什么是低码,为什么它如此流行, ...
- java data使用_@Data注解详解及使用方法-Fun言
@Data作用 去除Getter,Setter,equals,hashCode,toString方法,@Data注解在类上时,简化java代码编写,为该类提供读写属性.简单来说就是不用再手动添加get ...
- sql科学计数法转换为普通数字_一张图读懂Python3的Number(数字)类型
新朋友请点上方"数据分析师攻略"加关注 Number(数字)是Python3六个标准的数据类型中其中一种,它是一种不可变数据,分别有整型(int).浮点型(float).布尔型(b ...
- java 字段构造函数_依赖注入–字段vs构造函数vs方法
java 字段构造函数 嗨,今天,我想简短地讨论将依赖项注入您的类的不同方式. 通常,您有以下三种注射方法 直接进入字段/属性 通过显式的setter方法 通过显式的构造函数参数 现场注入 这种类型的 ...
- vueinput里只能输入数字_大佬们,vue里面 限制input只能输入数字怎么做啊?
可以参考下面的,目前这个是限制,只能输入数字,小数点只保留2位,限制不能输入空格 new Vue({ el: "#app", data: { a: "" }, ...
- java springmvc搭建_【JavaEE】Springmvc+Spring搭建方法及example
这一篇在前一篇Springmvc的基础上,加上Spring.Spring的主要用途叫做控制反转(依赖注入,IoC/DI)和面向切面的编程(AOP),本文只介绍IoC,因为AOP主要的应用场景是记录日志 ...
- 打乱 数字_崔召幼儿园中班悦享时光——亲子益智游戏数字配对
亲爱的小朋友们,我们已经掌握了简单的,数字宝宝,今天让我们通过已有的数字经验和点数经验来玩一个数字配对的游戏吧! 准备: 1.准备骰子一个,吸管一支,数字1-6卡片. 2.一个鞋盒盖,一个可以装数字卡 ...
- 8. 返回数组里出现次数最多的数字_剑指offer 数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
最新文章
- 成为顶级CIO ,应该怎么做?
- 数据库设计:关于枚举类型的表结构设计法,个人拙见
- android网络请求 post
- Android学习 —— 多种适配器方式实现ListView
- 大数据架构如何挑选机器.
- iis php 0x80070032,访问网站时 HTTP 错误 404.17 - Internet Information Services | Microsoft Docs...
- X-NUCA全国高校网安联赛7月训练题解
- 解开Android应用程序组件Activity的singleTask之谜(3)
- Android修炼之道—自定义控件 (300喵喵币)
- python flag用法_python flag什么意思
- DNS大全(114DNS 、阿里DNS、百度DNS 、360 DNS、Google DNS)
- C#Winform实现手写录入签名与保存为透明png图片
- Ubuntu下安装rsh实现无密码访问
- 1010 -- 青蛙的约会
- 台湾李宏毅教授深度学习
- C语言求1-1/2+1/3-1/4+...+1/99-1/100
- x光肺部分割数据集_LIDC-IDRI肺结节Dicom数据集解析与总结
- 计算机病毒的依赖性,计算机辅助框架英语依赖性翻译研究-计算机病毒论文-计算机论文.docx...
- 大学计算机ppt学校题材实验报告,PPT的实验报告
- SpringBoot系列:9. 分布式系统,Dubbo,Zookeeper服务注册与发现