实现无类型参数的通用接口

问题描述:

比方说,我有一个泛型接口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

@ johnchen902在我意识到你是中国人之前,当我看到“a”之前,我以为你会打破种族主义的咆哮,在我意识到你是中国人之前:P – christopher 2013-05-12 07:39:47

+0

@ johnchen902这很漂亮话题:p但是,*人恰恰。事实上,我和你一样去了同一所高中。 – 2013-05-12 07:44:08

你的问题:

瓦在这里发生?

由于您遗漏了泛型类型,因此系统将其推断为Object。你可以做相同的结果如下:

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

下一个问题:

是否有可能迫使用户编写类型参数与工具(如B实现A)

是的。这是如何:

interface A<T extends Integer> 

希望这会有所帮助。

+2

最后的细节:public Integer getT()...'在上面的'T'是'Object',因为[协变返回类型](http://docs.oracle.com/javase/tutorial/java/javaOO/returnvalue.html) – 2013-05-13 01:01:59

这里会发生什么?

那么,因为你已经将接口实现作为原始类型,返回类型必须是Object。它不会推断返回类型,但如果返回类型是Object(它是Java中的每个对象),那么它将正常工作。

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

强制用户键入它?电脑功能强大,但精神控制还有一段路要走。

+0

我不想控制用户的头脑哈哈。我的意思是,我可以强制用户通过'interface A '给它一个扩展'Foo'的类型。 – 2013-05-12 07:46:27

好了,“正确”的方式来实现B类:

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

一旦你正在写的类B这样你强制用户使用这个类只有Integer类型。

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

这里会发生什么事 嗯,因为整数扩展对象,所以它会正常工作,建议你添加参数与 实现

+0

“它会正常工作” - 但是'B'是'A'而不是'A ',这有一些暗示。 – 2013-05-12 15:26:26

+0

更改为A duplicatedcode 2013-05-12 16:16:44

+0

呃,我不是OP,但是这并不回答“这里会发生什么?”无论如何。 – 2013-05-12 16:19:54