- 浏览: 308808 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
suxiaojack:
15题,就是拿杨辉三角填充空格,答案应该是C(38,19)吧? ...
Project Euler解题汇总 013 ~ 022 -
songhaikang:
这篇文章挺好的,跟着你的步骤很快就可以入门了。非常感谢。
[转贴]Derby入门 —— (1) -
Eastsun:
呵呵,我没有Android的机器,所以兴趣不大
使用Java写的GVmaker虚拟机(开源) -
crapricorn:
那个版本的用不了虚拟键盘啊 呵呵 我们的手机没有实体键盘呀 所 ...
使用Java写的GVmaker虚拟机(开源) -
Eastsun:
crapricorn 写道希望sun侠能做出个android平 ...
使用Java写的GVmaker虚拟机(开源)
本文内容主要来自Implicit Conversions: More Powerful than Dynamic Typing?,我只对其中一部分进行了翻译。
隐式转换是[url=Haskell type classes]Scala[/url]中实现的一种类似于Haskell type classes的类型系统,它使得Scala这种静态类型的语言具有某些“动态”的特性。下面用具体例子来说明。
案例1:给String添加一个reduce方法,其返回值为字符串中大写字母组成的新字符串。
在Scala中,最终效果如下:
由于String是Java语言内置的类型,现在遇到的问题是:在静态语言中,我们不能在运行时往已经存在的类中动态添加方法。
在Scala中,我们可以定义一个新的类型,使它具有所需要的方法,然后再顶一个一个从已有类型到新类型的隐式转换。然后Scala编译器将会在幕后实施其魔法。代码如下:
作为对照,我们看看在Ruby中的实现:
案例2:一个稍微复杂一点的问题:重载整数类型的<操作符,使得它能与String比较,并且但String的长度小于该整数时返回true,否则返回false
在Scala中,同样可以通过隐式转换机制来解决该问题。这一次我们使用比上面更简洁的形式:
下面我们看看Ruby中如何解决这个问题,一个很自然的想法是玩Fixnum中添加所需的方法:
很不幸的是,这个看起来很对的方法是行不通的。每次调用整数的<操作符时都会进入一个死循环并很快导致堆栈溢出。
我们可以将方法改写成如下以避免这个问题:
这次不用担心堆栈溢出了,但新的问题出现了:
这个问题的最终Ruby解法是这样的:
囧,相比Scala,Ruby的解决方法显得即冗长且丑陋。
教训人也得找点因头?你这句话简直是胡扯,我哪一句被您看出不谦虚了?
俺看到了,scala确实很优秀.
没有更多想法与大家讨论,于是就没回贴.
隐式转换,记得groovy也有类似的方案.
这个就别拿来说事了,活脱脱模仿javascript原型继承,调用原型的方法
隐式转换是[url=Haskell type classes]Scala[/url]中实现的一种类似于Haskell type classes的类型系统,它使得Scala这种静态类型的语言具有某些“动态”的特性。下面用具体例子来说明。
案例1:给String添加一个reduce方法,其返回值为字符串中大写字母组成的新字符串。
在Scala中,最终效果如下:
//Scala val acronym = "Microsoft Certified Systems Engineer".reduce println(acronym) // MCSE
由于String是Java语言内置的类型,现在遇到的问题是:在静态语言中,我们不能在运行时往已经存在的类中动态添加方法。
在Scala中,我们可以定义一个新的类型,使它具有所需要的方法,然后再顶一个一个从已有类型到新类型的隐式转换。然后Scala编译器将会在幕后实施其魔法。代码如下:
class MyStr(str:String) { def reduce = str.foldLeft(""){ (s,c) => if(c.isUpperCase) s+c else s } } implicit def str2MyStr(str:String) = new MyStr(str)
作为对照,我们看看在Ruby中的实现:
class String def reduce arr = unpack('c*').select { |c| (65..90).include? c } arr.pack 'c*' end end puts 'HyperText Transfer Protocol'.reduce # HTTP
案例2:一个稍微复杂一点的问题:重载整数类型的<操作符,使得它能与String比较,并且但String的长度小于该整数时返回true,否则返回false
在Scala中,同样可以通过隐式转换机制来解决该问题。这一次我们使用比上面更简洁的形式:
//Scala,that's all implicit def lessThanOverload(i: Int) = new { def <(str: String) = str.length < i }
下面我们看看Ruby中如何解决这个问题,一个很自然的想法是玩Fixnum中添加所需的方法:
class Fixnum def <(str) str.size < self end end
很不幸的是,这个看起来很对的方法是行不通的。每次调用整数的<操作符时都会进入一个死循环并很快导致堆栈溢出。
我们可以将方法改写成如下以避免这个问题:
class Fixnum def <(str) self >= str.size end end
这次不用担心堆栈溢出了,但新的问题出现了:
引用
irb(main):006:0> 123 < 'test'
=> true
irb(main):007:0> 123 < 123
=> true
=> true
irb(main):007:0> 123 < 123
=> true
这个问题的最终Ruby解法是这样的:
class Fixnum alias_method :__old_less_than__, '<'.to_sym def <(target) if target.kind_of? String __old_less_than__ target.size else __old_less_than__ target end end end
囧,相比Scala,Ruby的解决方法显得即冗长且丑陋。
评论
13 楼
Scriptlet
2008-10-08
所有的动态方法都属于耍小聪明,貌似可以解决一些小问题,节约一点时间。但是在大型项目中全是噩梦-根本都不知道对象在运行态成了什么东西。
12 楼
smilerain
2008-09-17
用个方法转换最直接. java多了个范型很不爽.
11 楼
ray_linn
2008-09-17
zbm2001 写道
请移步:
http://www.cnblogs.com/allenlooplee/archive/2008/06/01/1211520.html
PS: 吸纳别人优秀的东西是件非常好的事情,但起码也得谦虚点。
http://www.cnblogs.com/allenlooplee/archive/2008/06/01/1211520.html
PS: 吸纳别人优秀的东西是件非常好的事情,但起码也得谦虚点。
教训人也得找点因头?你这句话简直是胡扯,我哪一句被您看出不谦虚了?
10 楼
liusong1111
2008-09-17
Eastsun 写道
对于隐式转换,我这儿讲的只是它的两个比较简单的应用。
这里有几篇比较不错的文章:
scala学习笔记(5) -- implicit type
Scala Implicits: a dose of Magic
还有,这里还有个帖子:付出太多,得到太少 - 闲谈函数返回值
我在后面给出了个Scala的解决方法能够解决LZ提出的部分要求,但不知是没人看到还是我的解法不符合要求,没有人对此关心。
这里有几篇比较不错的文章:
scala学习笔记(5) -- implicit type
Scala Implicits: a dose of Magic
还有,这里还有个帖子:付出太多,得到太少 - 闲谈函数返回值
我在后面给出了个Scala的解决方法能够解决LZ提出的部分要求,但不知是没人看到还是我的解法不符合要求,没有人对此关心。
俺看到了,scala确实很优秀.
没有更多想法与大家讨论,于是就没回贴.
隐式转换,记得groovy也有类似的方案.
9 楼
Eastsun
2008-09-17
对于隐式转换,我这儿讲的只是它的两个比较简单的应用。
这里有几篇比较不错的文章:
scala学习笔记(5) -- implicit type
Scala Implicits: a dose of Magic
还有,这里还有个帖子:付出太多,得到太少 - 闲谈函数返回值
我在后面给出了个Scala的解决方法能够解决LZ提出的部分要求,但不知是没人看到还是我的解法不符合要求,没有人对此关心。
这里有几篇比较不错的文章:
scala学习笔记(5) -- implicit type
Scala Implicits: a dose of Magic
还有,这里还有个帖子:付出太多,得到太少 - 闲谈函数返回值
我在后面给出了个Scala的解决方法能够解决LZ提出的部分要求,但不知是没人看到还是我的解法不符合要求,没有人对此关心。
8 楼
Eastsun
2008-09-17
假设就和Date的Year比较吧,这样就可以了:
implicit def lessThanOverload(i: Int) = new { import java.util.Date def <(str: String) = str.length < i def <(date: Date) = date.getYear < i }
7 楼
QuakeWang
2008-09-17
请教一个问题,对于需求2,如果还需要增加使得它能与时间类型比较,在Scala中应该如何写?是像这样?
implicit def lessThanOverload(i: Int) = new { def <(str: String) = str.length < i def <(date: Date) = date.... }
6 楼
zbm2001
2008-09-17
请移步:
http://www.cnblogs.com/allenlooplee/archive/2008/06/01/1211520.html
PS: 吸纳别人优秀的东西是件非常好的事情,但起码也得谦虚点。
http://www.cnblogs.com/allenlooplee/archive/2008/06/01/1211520.html
PS: 吸纳别人优秀的东西是件非常好的事情,但起码也得谦虚点。
5 楼
ray_linn
2008-09-17
回楼上:
C#却是静态的,你检查个类型给我看看?你再怎么着,你还得显式声明,C#却是自动的。
C#却是静态的,你检查个类型给我看看?你再怎么着,你还得显式声明,C#却是自动的。
4 楼
zbm2001
2008-09-17
ray_linn 写道
看看C#的,超级简单
这样就可以attach到任意一个String上(只要你引用它的namespace).
public class StringFun{ public static Reduce(this string str){ //bala bala } } public class Demo{ public static void Main(String[] strs){ String str="Smaple String"; str.Reduce();} }
这样就可以attach到任意一个String上(只要你引用它的namespace).
这个就别拿来说事了,活脱脱模仿javascript原型继承,调用原型的方法
3 楼
ray_linn
2008-09-17
看看C#的,超级简单
这样就可以attach到任意一个String上(只要你引用它的namespace).
public static class Fun{ public static string Reduce(this string str){ var res = (from c in str.ToCharArray() where Char.IsUpper(c) select c).ToArray<char>(); return new string(res); } }
这样就可以attach到任意一个String上(只要你引用它的namespace).
2 楼
Eastsun
2008-09-16
但这些缺点动态语言不同样存在么?
1 楼
hax
2008-09-16
隐式转换也存在问题,它降低了代码的直观性。后面那个例子尤其如此——运算符重载所具有的缺点,隐式转换也同样有。
发表评论
-
JavaFX1.2的性能貌似有了很大的提升
2009-06-03 09:36 1988Osvaldo Pinali Doederlein's B ... -
Java.next:第二部分——与Java互操作
2008-09-19 23:05 1882原文地址:Java.next #2: Java Inter ... -
Java.next:第一部分——共同点
2008-09-19 13:31 1553原文地址:Java.next: Common Ground ... -
澄清:Java中只有按值传递,没有按引用传递!
2008-07-13 22:23 3994前言:在JAVA面试题解惑系列(五)——传了值还是传了引用 ... -
Ruby,Python不能威胁到Java的13个理由
2008-05-28 22:50 1482最近,danielstoner发表了一篇题为13 reas ... -
Java:进化的尽头
2008-05-28 17:45 1307原文地址:http://blog. ... -
《Effective Java》: Joshua Bloch访谈
2008-05-23 00:52 2620原文地址:Effective ... -
JSR 308:Java语言复杂度在恣意增长?
2008-05-20 13:54 1764原帖地址:http://www ... -
Sun能否让Java重振雄风?
2008-05-13 14:42 0原文地址:Can Sun rejuvenate Java? ... -
Groovy, JRuby, Jython, Scala:谁是胜利者?
2008-05-13 00:04 6560原文地址:Groovy, JRuby, Jython, Sca ... -
JAVA比C++更快?
2008-04-08 15:03 2053首先:我必须承认,我取JA ... -
在J2ME中模拟C语言中的文件操作
2008-02-27 00:09 1626最近在写一个模拟器(OR虚拟机),用于运行文曲星(一种 ... -
使用StAX解析XML:使用定制事件和编写 XML
2007-10-12 23:01 2108除了提供一个低层的基 ... -
使用StAX解析XML: 拉式解析和事件
2007-10-08 20:53 33092007 年 7 月 05 日 Streaming API ... -
[转载]Streaming API for XML (StAX) 简介
2007-10-07 13:35 2309Streaming API for XML (StAX) 是用 ... -
使用CookieHandler管理Cookie数据
2007-05-31 23:22 10893前言 : 因为只学过J2SE部分,对JAVA网络编程也不甚了 ... -
浅谈HTTP的无状态性
2007-05-30 01:26 2039HTTP是Hyper Text Transf ... -
用动态代理进行修饰
2007-04-11 16:26 1859动态代理为实 ... -
一种得到代码所在行号的方法
2007-04-02 20:03 3928RT,今天在论坛上看到有人提出这个问题,马上联想 ... -
网络词汇表
2007-04-01 13:33 1999【协议 】--- protocol,指通信双方通信时遵守的一 ...
相关推荐
VC++,即Visual C++,是Microsoft开发的一款强大的C++集成开发环境,它支持多种类型的类型转换,包括隐式转换和显式转换。下面将详细阐述VC++中涉及的各类类型转换方法。 1. 隐式类型转换:这是编译器自动进行的...
Scala中的隐式类型转换是Scala语言中的一种强大语言特性,可以自动进行某些数据类型的隐式转换。隐式类型转换可以分为两种:隐式参数和隐式转换。下面将对这两种类型进行详细的介绍。 一、隐式参数 隐式参数是指在...
本篇文章将深入探讨C++中不同类型的转换方法,包括隐式转换和显式转换,以及它们在实际编程中的应用。 首先,我们讨论隐式类型转换(也称为自动类型转换)。在C++中,当一个数据类型可以安全地被转换为另一种类型时...
在Scala中,隐式参数和隐式转换极大地增强了代码的简洁性和可读性,同时也为类型系统提供了更大的灵活性。 **隐式参数**: 在Scala中,我们可以定义带有`implicit`关键字的参数,这些参数被称为隐式参数。当一个...
在C#编程语言中,动态类型(Dynamic)是一种强大的特性,它允许程序员在运行时进行类型检查和操作。这个特性引入自C# 4.0版本,为开发者提供了更大的灵活性,尤其是在处理非强类型的数据或者与动态语言如Python、...
总结来说,C++中的类隐式转换和强制转换是强大的工具,它们让类型转换变得灵活,但也可能引入难以察觉的错误。理解这些转换的规则和限制,对于编写安全、可维护的代码至关重要。在使用转换时,应该注意避免不必要的...
隐式转换是指编译器自动进行的类型转换,而显式转换则是由开发者明确指定的类型转换过程。本文将重点介绍显式转换,尤其是通过使用`as`关键字实现的类型转换。 ### 显式类型转换:使用`as` 在ActionScript 3中,`...
1. 隐式类型转换:隐式类型转换是指Java自动将一种数据类型转换为另一种数据类型的过程,例如将int类型转换为double类型。 2. 显示类型转换:显示类型转换是指使用强制类型转换符号将一种数据类型转换为另一种数据...
它们提供了一种安全和灵活的方式来转换类型,同时允许程序员控制转换过程。正确使用这些运算符可以避免许多常见的错误,如类型不匹配和运行时错误。然而,过度使用或不当使用类型转换可能会导致代码难以理解和维护,...
向上类型转换通常是指隐式转换,即编译器自动进行的转换,它发生在基类指针或引用指向派生类对象时。 1. 隐式向上类型转换: 当一个派生类对象被赋值给基类对象、指针或引用时,会发生隐式向上类型转换。这是因为...
4. **`static_cast`**:可以执行大多数类型的转换,包括显式转换和隐式转换。它不涉及运行时检查,因此速度较快,但这也意味着它可能不如`dynamic_cast`那样安全。它可以用于指针间的转换、基本类型之间的转换以及...
- **隐式转换**: 不需要显式转换即可完成的数据类型转换。 - **显式转换**: 显式使用转换操作符进行类型转换。 - **用户定义转换**: 用户可以通过定义转换器实现特定类型的转换。 - **1.2.3 数组类型**: - 数组...
当一个较小的数据类型赋值给较大的数据类型时,或者在运算过程中需要将两个兼容类型结合时,会自动进行隐式转换。例如,从byte到int,或从float到double。这种转换不会丢失信息,因此Java允许自动进行。 2. **显式...
// 隐式转换 ``` 2. **显式类型转换**:需要使用强制类型转换运算符 `(type)`,当目标类型不能自动安全地容纳源类型时,如从`double`到`int`。这可能导致数据丢失或异常: ```csharp double d = 3.14; int i =...
本文将详细介绍C#中的数据类型转换方法,包括隐式转换、显式转换(强制类型转换)、类型转换异常处理等,并通过实例演示如何正确地进行数据类型转换。 #### 二、C#中的数据类型 在深入了解类型转换之前,我们先...
C# 10.0 对 lambda 表达式进行了多项改进,使其更加强大和灵活。这些增强功能包括能够为 lambda 表达式提供自然类型以及将...方法组转换:方法组现在可以隐式转换为具有匹配参数类型的委托,进一步简化了委托的使用。
隐式转换发生在当从较小范围的数据类型转换到较大范围的数据类型时,例如将byte类型转换为int类型。这种转换不需要显式指定,编译器会自动进行。 ##### 显式转换 显式转换则是在将较大范围的数据类型转换为较小...
类型转换分为隐式转换和显式转换: 1. **隐式类型转换**:当一个较小的数据类型赋值给一个较大的数据类型时,系统会自动进行转换,如int赋值给long。但是需要注意,如果数据溢出,可能会导致错误。 2. **显式类型...
在C语言中,不同类型的数据进行运算时会进行隐式转换,通常是从低精度类型提升到高精度类型。例如,`int`与`float`相加时,`int`会被提升为`float`。但有时我们需要显式转换,例如`(int)3.6`将浮点数转换为整数,...
`reinterpret_cast` 是一种非常强大的类型转换工具,它用于执行“重新解释”操作,即将一个类型的地址重新解释为另一个类型的地址。这种转换通常用于低级别的编程,例如在处理硬件接口时。例如: ```cpp char ch = '...