假设我有一个带有泛型类型的接口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>
)?
答案 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,所以它可以正常工作,建议你添加参数 实现