ISomeBaseInterface不能使用不同的参数继承:<java.lang.object>和&lt;&gt; </java.lang.object>

时间:2011-12-08 15:04:04

标签: java generics

当我在Eclipse中编译以下代码时 - 没有任何错误 只有一个警告:

  

SomeDerivedAbstractClass是原始类型。对泛型类型的引用   SomeDerivedAbstractClass应该参数化

我在最新的Eclipse Indigo(3.7.1)中测试了这段代码 但是当我尝试通过javac编译此代码时出现以下错误:

SomeConcreateClass.java:1: ISomeBaseInterface cannot be inherited with different arguments: <java.lang.Object> and <>
public class SomeConcreateClass
       ^
1 error

我编译了这个代码起诉Java 5和Java 6.在这两种情况下都有错误 此代码有什么问题?

public class SomeConcreateClass
   extends SomeDerivedClass
   implements ISomeInterface
{}

class SomeDerivedClass<T>
    extends SomeAbstractClass<Object>
    implements ISomeInterface
{
}

abstract class SomeAbstractClass<T> 
   implements ISomeBaseInterface<T>
{
}

interface ISomeInterface extends ISomeBaseInterface<Object> 
{}

interface ISomeBaseInterface<T>
{
}

但是下面的代码不能在Eclipse或javac中编译:

public class SomeConcreateClass
   extends SomeAbstractClass
   implements ISomeInterface
{}

abstract class SomeAbstractClass<T> 
   implements ISomeBaseInterface<Object>
{}

interface ISomeInterface extends ISomeBaseInterface<Object> 
{}

interface ISomeBaseInterface<T>
{}

javac:

  

SomeConcreateClass.java:1:ISomeBaseInterface不能继承   不同的论点:和&lt;&gt;公共课   SomeConcreateClass          ^ 1错误

Eclipse:

  

接口ISomeBaseInterface不能多次实现   使用不同的参数:ISomeBaseInterface和   ISomeBaseInterface

那么 - 这是Eclipse中的一个错误吗? 它与https://bugs.eclipse.org/bugs/show_bug.cgi?id=81824是一样的错误吗?

更多更新:
此代码编译时javac和Eclipse都没有错误:

public class SomeConcreateClass
   extends SomeDerivedClass
   implements ISomeInterface
{}

class SomeDerivedClass
    extends SomeAbstractClass<Object>
    implements ISomeInterface
{}

abstract class SomeAbstractClass<T> 
   implements ISomeBaseInterface<T>
{}

interface ISomeInterface extends ISomeBaseInterface<Object> 
{}

interface ISomeBaseInterface<T>
{}

只有一个区别:SomeDerivedClass没有参数化 我不明白这对ISomeBaseInterface有什么影响。

还有一个更新:
我检查了IntellijIDEA中第一个例子的代码 - 这个IDE显示错误 但我认为它使用不同的编译方法而不是Eclipse。

1 个答案:

答案 0 :(得分:1)

东西&LT;&GT;与Something&lt; Object&gt;不同(尽管看起来这似乎是合理的)。

SomeAbstractClass&LT; T&GT;实现ISomeBaseInterface&lt; T&gt;和SomeAbstractClass&lt;&gt;实现ISomeBaseInterface&lt;&gt;因此,当您使用SomeDerivedAbstractClass&lt;&gt; (在SomeConcreateClass中),您要求该类实现ISomeConcreateInterface(即ISomeBaseInterface&lt; Object&gt;)和ISomeBaseInterface&lt;&gt;与此同时,它无法做到。

我想你可能想要使用SomeDerivedAbstractClass&lt;?&gt ;.