A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tuan2016 中级黑马   /  2016-5-14 23:12  /  635 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 tuan2016 于 2016-5-15 00:15 编辑

2.5 更好的类型推测机制
Java 8在类型推测方面有了很大的提高。在很多情况下,编译器可以推测出确定的参数类型,这样就能使代码更整洁。让我们看一个例子:
  1. package com.javacodegeeks.java8.type.inference;

  2. public class Value< T > {
  3.     public static< T > T defaultValue() {
  4.         return null;
  5.     }
  6.    
  7.     public T getOrDefault( T value, T defaultValue ) {
  8.         return ( value != null ) ? value : defaultValue;
  9.     }
  10. }
复制代码

这里是Value< String >类型的用法。
  1. package com.javacodegeeks.java8.type.inference;

  2. public class TypeInference {
  3.     public static void main(String[] args) {
  4.         final Value< String > value = new Value<>();
  5.         value.getOrDefault( "22", Value.defaultValue() );
  6.     }
  7. }
复制代码

Value.defaultValue()的参数类型可以被推测出,所以就不必明确给出。在Java 7中,相同的例子将不会通过编译,正确的书写方式是 Value.< String >defaultValue()。

2.6 扩展注解的支持
Java 8扩展了注解的上下文。现在几乎可以为任何东西添加注解:局部变量、泛型类、父类与接口的实现,就连方法的异常也能添加注解。下面演示几个例子:
  1. package com.javacodegeeks.java8.annotations;

  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. import java.util.ArrayList;
  7. import java.util.Collection;

  8. public class Annotations {
  9.     @Retention( RetentionPolicy.RUNTIME )
  10.     @Target( { ElementType.TYPE_USE, ElementType.TYPE_PARAMETER } )
  11.     public @interface NonEmpty {        
  12.     }
  13.         
  14.     public static class Holder< @NonEmpty T > extends @NonEmpty Object {
  15.         public void method() throws @NonEmpty Exception {           
  16.         }
  17.     }
  18.         
  19.     @SuppressWarnings( "unused" )
  20.     public static void main(String[] args) {
  21.         final Holder< String > holder = new @NonEmpty Holder< String >();      
  22.         @NonEmpty Collection< @NonEmpty String > strings = new ArrayList<>();      
  23.     }
  24. }
复制代码

ElementType.TYPE_USE和ElementType.TYPE_PARAMETER是两个新添加的用于描述适当的注解上下文的元素类型。在Java语言中,注解处理API也有小的改动来识别新增的类型注解。

3. Java编译器的新特性
3.1 参数名字
很长一段时间里,Java程序员一直在发明不同的方式使得方法参数的名字能保留在Java字节码中,并且能够在运行时获取它们(比如,Paranamer类库)。最终,在Java 8中把这个强烈要求的功能添加到语言层面(通过反射API与Parameter.getName()方法)与字节码文件(通过新版的javac的–parameters选项)中。
  1. package com.javacodegeeks.java8.parameter.names;

  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Parameter;

  4. public class ParameterNames {
  5.     public static void main(String[] args) throws Exception {
  6.         Method method = ParameterNames.class.getMethod( "main", String[].class );
  7.         for( final Parameter parameter: method.getParameters() ) {
  8.             System.out.println( "Parameter: " + parameter.getName() );
  9.         }
  10.     }
  11. }
复制代码

如果不使用–parameters参数来编译这个类,然后运行这个类,会得到下面的输出:
  1. Parameter: arg0
复制代码

如果使用–parameters参数来编译这个类,程序的结构会有所不同(参数的真实名字将会显示出来):
  1. Parameter: args
复制代码

对于有经验的Maven用户,通过maven-compiler-plugin的配置可以将-parameters参数添加到编译器中去。
  1. <plugin>
  2.     <groupId>org.apache.maven.plugins</groupId>
  3.     <artifactId>maven-compiler-plugin</artifactId>
  4.     <version>3.1</version>
  5.     <configuration>
  6.         <compilerArgument>-parameters</compilerArgument>
  7.         <source>1.8</source>
  8.         <target>1.8</target>
  9.     </configuration>
  10. </plugin>
复制代码

针对Java 8最新发布的Eclipse Kepler SR2(请检查这里的下载说明)提供了非常实用的配置选项,可以通过下图的配置方式来控制编译器行为

图1. 配置Eclipse工程使之支持Java 8编译器的新特性——parameters参数
此外,Parameter类有一个很方便的方法isNamePresent()来验证是否可以获取参数的名字。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马