the differences between groovy and java

the differences between groovy and java,第1张

概述Groovy tries to be as natural as possible for Java developers. We’ve tried to follow the principle of least surprise when designing Groovy, particularly for developers learning Groovy who’ve come from

Groovy trIEs to be as natural as possible for Java developers. We’ve trIEd to follow the principle of least surprise when designing Groovy,particularly for developers learning Groovy who’ve come from a Java background.

Here we List all the major differences between Java and Groovy.

1. Default imports

All these packages and classes are imported by default,i.e. you do not have to use an explicit import statement to use them:

java.io.*

java.lang.*

java.math.BigDecimal

java.math.BigInteger

java.net.*

java.util.*

groovy.lang.*

groovy.util.*

2. Multi-methods

In Groovy,the methods which will be invoked are chosen at runtime. This is called runtime dispatch or multi-methods. It means that the method will be chosen based on the types of the arguments at runtime. In Java,this is the opposite: methods are chosen at compile time,based on the declared types.

The following code,written as Java code,can be compiled in both Java and Groovy,but it will behave differently:

int method(String arg) { return 1;}Object2  o = "Object" result (o);

In Java,you would have:

assertEquals(, result);

Whereas in Groovy:

o is declared as an Object,whereas Groovy will choose at runtime,when the method is actually called. Since it is called with a String,then the String version is called.

3. Array initializers

In Groovy,the { …​ } block is reserved for closures. That means that you cannot create array literals with this Syntax:

[]
4. Package scope visibility

In Groovy,omitting a modifIEr on a fIEld doesn’t result in a package-private fIEld like in Java:

@PackageScope:

Path file Paths.get("/path/to/file");Charset charset Charsetforname"UTF-8"tryBufferedReader reader filesnewBufferedReaderfile charset)) linewhile((line  readerreadline())!=nullSystemoutprintlnlinecatchIOException eprintstacktrace();}

can be written like this:

).eachline'UTF-8' println it }

or,if you want a version closer to Java:

groovy.lang.Closure,with some benefits and some differences. Accessing private fIElds and methods for example can become a problem,but on the other hand local variables don’t have to be final.      @H_244_419@        6.1. Static inner classes         

Here’s an example of static inner class:

import javautilconcurrent.CountDownLatchTimeUnit called CountDownLatchTimer timer Timer() timerschedule(TimerTaskvoID run calledcountDown},102)">0assertawait10TimeUnitSECONDS)
6.3. Creating Instances of Non-Static Inner Classes

In Java you can do this:

y.new X() Syntax. Instead,you have to write new X(y),like in the code below:

Runnable run out"Run" ListforEach::);

Java 8 lambdas can be more or less consIDered as anonymous inner classes. Groovy doesn’t support that Syntax,but has closures instead:

each  // or List.each(this.&println)
8. GStrings

As double-quoted string literals are interpreted as GString values,Groovy may fail with compile error or produce subtly different code if a class with String literal containing a dollar character is compiled with Groovy and Java compiler.

While typically,Groovy will auto-cast between GString and String if an API declares the type of a parameter,beware of Java APIs that accept an Object parameter and then check the actual type.

9. String and Character literals

Singly-quoted literals in Groovy are used for String or GString,depending whether there is interpolation in the literal.

getClass()=="c""c"inGString

Groovy will automatically cast a single-character String to char only when assigning to a variable of type char. When calling methods with arguments of type char we need to either cast explicitly or make sure the value has been cast in advance.

Characterdigita16)==10:'But Groovy does Boxing'((char'a'false'Need explicit cast'catchMissingMethodException}

Groovy supports two styles of casting and in the case of casting to char there are subtle differences when casting a multi-char strings. The Groovy style cast is more lenIEnt and will take the first character,while the C-style cast will fail with exception.

// for single char strings,both are the same).class==Character"c"as// for multi char strings they are not'cx'=='c''will fail - not castable'GroovyCastException'cx'asType'c'
@H_419_792@ 10. Primitives and wrappers

Because Groovy uses Objects for everything,it autowraps references to primitives. Because of this,it does not follow Java’s behavior of wIDening taking priority over Boxing. Here’s an example using int

==         

In Java == means equality of primitive types or IDentity for objects. In Groovy == translates to a.compareto(b)==0,if they are Comparable,and a.equals(b) otherwise. To check for IDentity,there is is. E.g. a.is(b).

12. Conversions

Java does automatic wIDening and narrowing conversions.

@H_244_419@

* 'Y' indicates a conversion Java can make,'C' indicates a conversion Java can make when there is an explicit cast,'T` indicates a conversion Java can make but data is truncated,'N' indicates a conversion Java can’t make.

Groovy expands greatly on this.

table 1. Java Conversions
 

Converts to

Converts from

boolean

byte

short

char

int

long

float

double

boolean

-

N

N

N

N

N

N

N

byte

N

-

Y

C

Y

Y

Y

Y

short

N

C

-

C

Y

Y

Y

Y

char

N

C

C

-

Y

Y

Y

Y

int

N

C

C

C

-

Y

T

Y

long

N

C

C

C

C

-

T

T

float

N

C

C

C

C

C

-

Y

double

N

C

C

C

C

C

C

-

@H_244_419@

* 'Y' indicates a conversion Groovy can make,'D' indicates a conversion Groovy can make when compiled dynamically or explicitly cast,'T` indicates a conversion Groovy can make but data is truncated,'B' indicates a Boxing/unBoxing operation,'N' indicates a conversion Groovy can’t make.

The truncation uses Groovy Truth when converting to boolean/Boolean. Converting from a number to a character casts the Number.intvalue() to char. Groovy constructs BigInteger and BigDecimal using Number.doubleValue() when converting from a float or Double,otherwise it constructs using toString(). Other conversions have their behavior defined by java.lang.Number.

13. Extra keywords

There are a few more keywords in Groovy than in Java. Don’t use them for variable names etc.

as

def

in

trait

总结

以上是内存溢出为你收集整理的the differences between groovy and java全部内容,希望文章能够帮你解决the differences between groovy and java所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1254386.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

table 2. Groovy Conversions
 

Converts to

Converts from

boolean

Boolean

byte

Byte

short

Short

char

Character

int

Integer

long

Long

BigInteger

float

float

double

Double

BigDecimal

boolean

-

B

N

N

N

N

N

N

N

N

N

N

N

N

N

N

N

N

Boolean

B

-

N

N

N

N

N

N

N

N

N

N

N

N

N

N

N

N

byte

T

T

-

B

Y

Y

Y

D

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Byte

T

T

B

-

Y

Y

Y

D

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

short

T

T

D

D

-

B

Y

D

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Short

T

T

D

T

B

-

Y

D

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

char

T

T

Y

D

Y

D

-

D

Y

D

Y

D

D

Y

D

Y

D

D

Character

T

T

D

D

D

D

D

-

D

D

D

D

D

D

D

D

D

D

int

T

T

D

D

D

D

Y

D

-

B

Y

Y

Y

Y

Y

Y

Y

Y

Integer

T

T

D

D

D

D

Y

D

B

-

Y

Y

Y

Y

Y

Y

Y

Y

long

T

T

D

D

D

D

Y

D

D

D

-

B

Y

T

T

T

T

Y

Long

T

T

D

D

D

T

Y

D

D

T

B

-

Y

T

T

T

T

Y

BigInteger

T

T

D

D

D

D

D

D

D

D

D

D

-

D

D

D

D

T

float

T

T

D

D

D

D

T

D

D

D

D

D

D

-

B

Y

Y

Y

float

T

T

D

T

D

T

T

D

D

T

D

T

D

B

-

Y

Y

Y

double

T

T

D

D

D

D

T

D

D

D

D

D

D

D

D

-

B

Y

Double

T

T

D

T

D

T

T

D

D

T

D

T

D

D

T

B

-

Y

BigDecimal

T

T

D

D

D

D

D

D

D

D

D

D

D

T

D

T

D

-