相关疑难解决方法(0)

为什么这个通用java代码不会编译?

在这个简化的例子中,我有一个泛型类,以及一个返回Map而不管类型参数的方法.当我没有在包含类上指定类型时,为什么编译器会清除地图上的类型?

import java.util.Map;

public class MyClass<T>
{
    public Map<String, String> getMap()
    {   
        return null;
    }

    public void test()
    {   
        MyClass<Object> success = new MyClass<Object>();
        String s = success.getMap().get("");

        MyClass unchecked = new MyClass();
        Map<String, String> map = unchecked.getMap();  // Unchecked warning, why?
        String s2 = map.get("");

        MyClass fail = new MyClass();
        String s3 = fail.getMap().get("");  // Compiler error, why?
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到这个编译错误.

MyClass.java:20: incompatible types
found   : java.lang.Object
required: java.lang.String
                String s3 = fail.getMap().get("");  // Compiler error
Run Code Online (Sandbox Code Playgroud)

java generics

33
推荐指数
2
解决办法
2216
查看次数

结合原始类型和通用方法

这是一个问题,第一个代码清单编译得很好(JDK 1.6 | JDK 1.7):

ArrayList<String> a = new ArrayList<String>();
String[] s = a.toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)

但是,如果我将List引用声明为原始类型:

ArrayList a = new ArrayList();
String[] s = a.toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误,说明String[]是必需的,但是Object[]找到了.

这意味着我的编译器将泛型方法解释为返回,Object[]尽管String[]它接收了一个as参数.

我加倍检查了toArray(myArray)方法签名:

<T> T[] toArray(T[] a);
Run Code Online (Sandbox Code Playgroud)

因此,它是一个参数化方法,其类型参数<T>与List(即<E>)的类型参数无关.

我不知道在这里使用原始类型如何影响使用独立类型参数的参数化方法的评估.

  • 有谁知道为什么这段代码不能编译?
  • 有没有人知道记录这种行为的任何参考?

java generics raw-types generic-method

26
推荐指数
3
解决办法
3943
查看次数

标签 统计

generics ×2

java ×2

generic-method ×1

raw-types ×1