Java中泛型接口中隐藏在其他方法上的集合类型参数

Java中泛型接口中隐藏在其他方法上的集合类型参数,java,generics,Java,Generics,假设我有一个“通用”接口- 即使在eclipse中,当我将鼠标悬停在g1.hello上时,它也会将返回类型显示为List,而不是List 如果我使用普通接口(没有通用的),则不会发生这种情况。关于如何使其工作/为什么会发生的任何建议?您必须将接口定义为泛型(带有类型) 输出: 5 拉拉 洛洛 这与原始类型有关。首先,a 为了便于与非通用遗留代码接口,是可能的 使用参数化类型(§4.5)的擦除(§4.6)作为类型,或 对元素类型为a的数组类型(§10.1)的擦除 参数化类型。这种类型称为原始类型。

假设我有一个“通用”接口-

即使在eclipse中,当我将鼠标悬停在
g1.hello
上时,它也会将返回类型显示为
List
,而不是
List


如果我使用普通接口(没有通用的
),则不会发生这种情况。关于如何使其工作/为什么会发生的任何建议?

您必须将接口定义为泛型(带有类型)

输出:

5
拉拉
洛洛


这与原始类型有关。首先,a

为了便于与非通用遗留代码接口,是可能的 使用参数化类型(§4.5)的擦除(§4.6)作为类型,或 对元素类型为a的数组类型(§10.1)的擦除 参数化类型。这种类型称为原始类型。

您在这里使用的是这样一种原始类型

Generic g1 = new GenericImpl();
因为
Generic
没有类型参数。然后,JLS还声明

构造函数的类型(§8.8),实例方法(§8.4,§9.4),或 非静态字段(§8.3)M,属于未从中继承的原始类型C 它的超类或超接口是对应的原始类型 在对应于的泛型声明中删除其类型 C.

因此,当使用原始类型
Generic
时,
hello()
方法的返回类型为
List
,即删除
List
。同样地,
List#iterator()
的返回类型是
iterator
,而
iterator#next()
的返回类型是
Object
,这是一种不能转换为
String
的类型


您需要为您的
g1
类型声明使用类型参数,这样它就不会被视为原始类型的变量。

Ah我明白了。然而,在我的原始代码中,我使用了一个列表泛型,然后对每个泛型调用hello方法。i、 e.-for(Generic-Generic:generics){for(String-msg:Generic.hello()){等等。所以这仍然是一个问题,您的代码逐字说明
Generic g1=new-genericmpl()
。您的对象被定义为
泛型的原始类型。您必须使用泛型定义将其转换为泛型类型。输入泛型mpl的代码,这可能会有所帮助。
 Generic g1 = new GenericImpl();
 for (String msg : g1.hello()) {  // Gives compilation error : 
  // Type mismatch, cannot convert from element type Object to String
 ...
Generic<YourGenericType> g1 = new GenericImpl();
public class Test {
    public static void main(String[] args) {
        Generic<Integer> obj = new GenericImpl();
        System.out.println(obj.echo(5));
        for(String s : obj.hello()){
            System.out.println(s);
        }
    }
}

interface Generic<T> {
    public T echo(T input); 
    public List<String> hello();    
}

class GenericImpl implements Generic<Integer> {
    @Override
    public Integer echo(Integer input) {
        return input;
    }

    @Override
    public List<String> hello() {
        return new ArrayList<String>(Arrays.asList("lala", "lolo"));
    }   
}
Generic g1 = new GenericImpl();