6

假设我有一个A泛型类型的接口:

public interface A<T> {
    T getT();
}

和一个B实现它的类:

public class B implements A {
    public Integer getT() { return 1; }
}

...但没有给它一个类型参数。

这里会发生什么?A是推断吗A<Integer>?是否可以强制用户使用implements语句(如B implements A<Integer>)编写类型参数?

4

4 回答 4

6

你的问题:

这里会发生什么?

由于您遗漏了泛型类型,因此系统将其推断为Object. 您可以执行以下操作并获得相同的结果:

    public class B implements A<Object> { 
        ...
    }

下一个问题:

是否可以强制用户使用实现编写类型参数(如 B 实现 A)

是的。这是如何:

    interface A<T extends Integer> 

希望这可以帮助。

于 2013-05-13T00:55:23.557 回答
1

这里会发生什么?

好吧,因为您将接口实现保留为原始类型,所以返回类型必须是 type Object。它不会推断返回类型,但如果您的返回类型是 type Object,它是 Java 中的每个对象,那么它将正常工作。

是否可以强制用户使用 implements 语句编写类型参数(如 B 实现 A)?

强制用户输入?计算机很强大,但精神控制还有点距离。

于 2013-05-12T07:39:11.903 回答
1

好吧,实现类的“正确”方法B是:

public class B implements A<Integer> {
    @Override
    public Integer getT() {
        return 1;
    }
}

一旦您以B这种方式编写类,您就会强制用户仅使用Integer类型的此类。

当泛型说明符丢失(如您的示例中)时,代码被编译(因为泛型是擦除)但大多数 IDE 会产生警告(例如,在 Eclipse 中,警告是“A 是原始类型。对泛型类型 A 的引用应该参数化 B .java”

于 2013-05-12T07:40:43.913 回答
-1

这里会发生什么?好吧,因为 Integer 扩展了 Object ,所以它可以正常工作,建议你添加参数 with implements

于 2013-05-12T10:19:47.370 回答