java - 如何安全地返回通用对象

标签 java generics

我正在做一些实验,试图了解有关返回泛型的问题。以下程序运行时没有错误,并在最后打印“FOO gets BAR”。谁能解释为什么? GetMap() 成员不安全地将 HashMap 转换为 Map,在测试用例中是 Map。我所有的阅读都表明我应该得到 ClassCastException,但我没有得到。

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class GenericTrial
{
 public static <K,V> Map<K,V> GetMap()
 { 
  return (Map<K,V>)new HashMap<Integer,Integer>();
 }

    public static void main(String[] args)
    {
     try
     {
      Map<String,String> m = GetMap();
      m.put("FOO", "BAR");
      System.out.println("FOO gets " + m.get("FOO"));
     }
     catch (Exception e)
     {
      System.out.println("Got exception");
     }
    }
}

最佳答案

因为Java的type erasure ,在运行时 Map<K, V> 之间没有区别和一个 Map<T, U> .

泛型类型纯粹是编译时概念。

关于java - 如何安全地返回通用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4168208/

相关文章:

java - 如何初始化 TIME 数组? java 语

c# - 是否可以更改 Func<T, bool> 委托(delegate)的泛型类型参数?

c# - 从泛型类继承时需要 T 的列表或枚举器的建议

java - Maven2 编译我的测试,但不运行它们

javascript - 如何从 html 页面运行 jar 文件或 java 方法?

java - 如何检索 SSL 客户端正在使用的 KeyManager、TrustManager 和 SecureRandom 对象?

delphi - 如何使通用对象列表从特定基类工作?

java - 线程局部仅初始化为零

ios - 快速处理两种不同的值类型

c# 在 2/多个列表中查找一个项目