为什么在第二个示例中没有任何编译错误,但是在第一个示例中却存在以下编译错误?
SomeConcreateClass.java:1: ISomeBaseInterface cannot be inherited with different arguments: and <>
public class SomeConcreateClass
^
1 error
唯一的区别-在第二个示例中未对类SomeDerivedClass进行参数化.
范例1:
我在这个例子中正确理解吗
public class SomeConcreateClass
extends SomeDerivedClass
implements ISomeInterface
{}
class SomeDerivedClass /*
extends SomeAbstractClass
implements ISomeInterface
{}
abstract class SomeAbstractClass
implements ISomeBaseInterface
{}
interface ISomeInterface extends ISomeBaseInterface
{}
interface ISomeBaseInterface
{}
范例2:
public class SomeConcreateClass
extends SomeDerivedClass
implements ISomeInterface
{}
class SomeDerivedClass /*
extends SomeAbstractClass
implements ISomeInterface
{}
abstract class SomeAbstractClass
implements ISomeBaseInterface
{}
interface ISomeInterface extends ISomeBaseInterface
{}
interface ISomeBaseInterface
{}
更新:
我是否正确理解在下面的示例中,从SomeDerivedClass开始的所有树都将用作原始类型?
SomeBaseClass的第一个参数是List的信息将丢失.
这是正确的吗?
import java.util.List;
public class SomeConcreateClass
extends SomeDerivedClass
implements ISomeInterface
{
public static void main(String[] args) {
SomeConcreateClass c = new SomeConcreateClass();
List lst = c.getT(); //Type mismatch: cannot convert from Object to List
}
}
class SomeDerivedClass
extends SomeBaseClass /*
implements ISomeInterface
{}
class SomeBaseClass
implements ISomeBaseInterface
{
public T getT(){return null;}
}
interface ISomeInterface extends ISomeBaseInterface
{}
interface ISomeBaseInterface
{}
解决方法:
简而言之,使用原始类型(即使用不带类型参数的通用类型)会禁用其后的所有与通用相关的内容.
通常通过以下示例进行演示:
class Foo { public List m() { ... } }
String s1 = new Foo().m().get(0); // Compiles
String s2 = new Foo().m().get(0); // Cannot cast Object to String
您也有类似的情况,但这与继承而不是成员访问有关.
The superclasses (respectively, superinterfaces) of a raw type are the erasures of the superclasses (superinterfaces) of any of its parameterized invocations.
在第一个示例中,SomeDerivedClass是通用的,SomeConcreteClass继承它为原始类型.因此,ISomeBaseInterface< Object>就可以了.通过继承的该分支继承的继承变成其擦除ISomeBaseInterface,但是直接继承的ISomeInterface仍然继承ISomeBaseInterface< Object>.由于无法使用不同的类型参数多次实现相同的通用接口,因此编译器会报告错误.
在第二个示例中,SomeDerivedClass不是通用的,因此原始类型没有问题.
标签:generics,java
来源: https://codeday.me/bug/20191202/2085044.html