Compilation of a generic method using JDK 8 failed

I have some legacy code with a class Boxto host and retrieve data Serializablein Map, which works fine Oracle JRE 1.8 Update 102when compiling with Oracle JDK 1.7 Update 80. But when compiling with Oracle JDK 1.8 Updater 102it it does not work correctly. I had some problems with a common getfunction.

SSCCE, which outputs a formatted date from an instance Boxusing a problematic common function get:

import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;

public class Box implements Serializable{

   private HashMap<String, Serializable> values = new HashMap<String, Serializable>();

   public <T extends Serializable> T get(String key){

      return (T) this.values.get(key);
   }

   public void put(String key,
                   Serializable value){

      this.values.put(key,
                      value);
   }

   public static void main(String[] args){

      Box box = new Box();
      box.put("key",
              new Date());

      System.out.println(String.format("%1$td.%1$tm.%1$tY",
                                       box.get("key")));
   }
}

I get the following exception when it is compiled with JDK 1.8, and I run it with JRE 1.8:

An exception in the "main" thread java.lang.ClassCastException: java.util.Date cannot be passed to [Ljava.lang.Object; at Box.main (Box.java:31)

, System.out.println, get

: println

get.

unchecked or unsafe operations, , :

1.7:

  public static void main(java.lang.String[]);
    Code:
       0: new           #8                  // class Box
       3: dup
       4: invokespecial #9                  // Method "<init>":()V
       7: astore_1
       8: aload_1
       9: ldc           #10                 // String key
      11: new           #11                 // class java/util/Date
      14: dup
      15: invokespecial #12                 // Method java/util/Date."<init>":()V
      18: invokevirtual #13                 // Method put:(Ljava/lang/String;Ljava/io/Serializable;)V
      21: getstatic     #14                 // Field java/lang/System.out:Ljava/io/PrintStream;
      24: ldc           #15                 // String %1$td.%1$tm.%1$tY
      26: iconst_1
      27: anewarray     #16                 // class java/lang/Object
      30: dup
      31: iconst_0
      32: aload_1
      33: ldc           #10                 // String key
      35: invokevirtual #17                 // Method get:(Ljava/lang/String;)Ljava/io/Serializable;
      38: aastore
      39: invokestatic  #18                 // Method java/lang/String.format:(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
      42: invokevirtual #19                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      45: return

1.8:

  public static void main(java.lang.String[]);
    Code:
       0: new           #8                  // class Box
       3: dup
       4: invokespecial #9                  // Method "<init>":()V
       7: astore_1
       8: aload_1
       9: ldc           #10                 // String key
      11: new           #11                 // class java/util/Date
      14: dup
      15: invokespecial #12                 // Method java/util/Date."<init>":()V
      18: invokevirtual #13                 // Method put:(Ljava/lang/String;Ljava/io/Serializable;)V
      21: getstatic     #14                 // Field java/lang/System.out:Ljava/io/PrintStream;
      24: ldc           #15                 // String %1$td.%1$tm.%1$tY
      26: aload_1
      27: ldc           #10                 // String key
      29: invokevirtual #16                 // Method get:(Ljava/lang/String;)Ljava/io/Serializable;
      32: checkcast     #17                 // class "[Ljava/lang/Object;"
      35: invokestatic  #18                 // Method java/lang/String.format:(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
      38: invokevirtual #19                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      41: return

- , -?

PS: , Class<T> clazz get.

+4
2

public <T extends Serializable> T get(String key){

  return (T) this.values.get(key);
}

, " , , Serializable".

, , .

, promises , :

Date date=box.get("key");

String str=box.get("key");
String[] obj=box.get("key");

, Date, String String[] Serializable.

Object[] obj=box.get("key");

, Object[] Serializable, Object[], Serializable. Object[] & Serializable T (. ).


Java 7 Java 8 , Java 7 , ( " " ). , .. Serializable, , varargs.

, Java 8 . varargs, String.format(String,Object[]). , vararg.

. promises .

public Serializable get(String key) {
   return this.values.get(key);
}

.

Date date=(Date)box.get("key");

, :

System.out.println(String.format("%1$td.%1$tm.%1$tY", box.get("key")));

, ,

System.out.printf("%1$td.%1$tm.%1$tY%n", box.get("key"));

Class :

public <T extends Serializable> T get(String key, Class<T> type) {
   return type.cast(this.values.get(key));
}

...

Date date=box.get("key", Date.class);

, Serializable . , , . Collections.emptyList(), , Serializable. , JRE Serializable . , ObjectOutputStream.writeObject(…) Serializable , Object.

+8

, :

import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;

public class Box<T extends Serializable> implements Serializable {

   private HashMap<String, T> values = new HashMap<>();

   public T get(String key){
      return this.values.get(key);
   }

   public void put(String key,
                   T value){

      this.values.put(key,
                      value);
   }

   public static void main(String[] args){

      Box<Date> box = new Box<>();
      box.put("key", new Date());

      System.out.println(String.format("%1$td.%1$tm.%1$tY",
                                       box.get("key")));
   }
}

, Box HashMap<String, ...>

+1

Source: https://habr.com/ru/post/1661557/


All Articles