2013-07-11 62 views
5

我们可以逃脱这个在.NET:为什么Java不允许基于类型参数的重载?

interface I<A> {} 
interface I<A, B> {} 

...但在Java中,相同的代码会导致编译错误。

这很有趣,因为即使类型信息在运行时消失了,人们仍然期望有关类型参数数量的信息仍然存在。

如果此限制与类型擦除有关,有人可以解释原因吗?

+0

限制是你不能多次定义一个接口,你不能以这种方式重载它。在运行时,type-erasure将确保'I'实际上是不允许的相同类型,或者从技术上说它不会做你想要的。 –

回答

6

它不涉及类型擦除这么多,因为从使用raw type会产生歧义:

I eye = null; // which 'I' is it? 

原始类型被允许,以适应前在JDK 5.0中引入泛型编写的代码。

+0

所以问题不是类型擦除本身,只是Java允许使用基本相当于隐式传递Object作为类型参数的原始类型的事实? –

+0

.NET如何解决这个问题?原始类型是不允许的? – Thilo

+0

@JSmith确实是 – arshajii

1

在java中,泛型类/接口具有固定数量的泛型参数。这只是语言的定义方式。

最接近的事是什么,你所谈论的可能是:

interface I<A> {} 
interface J<A, B> extends I<A> {} 

J一个实例仍然分配给I类型的变量。

相关问题