实现没有类型参数的通用接口

时间:2013-05-12 07:34:33

标签: java generics interface

假设我有一个带有泛型类型的接口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 个答案:

答案 0 :(得分:5)

你的问题:

  

这里发生了什么?

由于您省略了泛型类型,系统将其推断为Object。您可以使用相同的结果完成以下操作:

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

下一个问题:

  
    

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

  

是。这是如何:

    interface A<T extends Integer> 

希望这有帮助。

答案 1 :(得分:1)

  

这里发生了什么?

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

  

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

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

答案 2 :(得分:1)

嗯,&#34;对&#34;实现类B的方法是:

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

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

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

答案 3 :(得分:-1)

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