爲什麼在第二個示例中沒有任何編譯錯誤,但在第一個示例中存在以下編譯錯誤?與Java泛型和繼承相關的編譯錯誤
SomeConcreateClass.java:1: ISomeBaseInterface cannot be inherited with different arguments: <java.lang.Object> and <>
public class SomeConcreateClass
^
1 error
唯一的區別 - 類SomeDerivedClass在第二個示例中沒有參數化。
例1:
別正確地明白,在此示例
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>
{}
實施例2:
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>
{}
UPDATE:
我是否正確地理解,例如,在低於所有樹開始m 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<T>
extends SomeBaseClass<List, T> /* <----- */
implements ISomeInterface
{}
class SomeBaseClass<T, M>
implements ISomeBaseInterface<T>
{
public T getT(){return null;}
}
interface ISomeInterface extends ISomeBaseInterface<List>
{}
interface ISomeBaseInterface<T>
{}
但ISomeInterface - 不是一個泛型類。爲什麼它不禁用所有與通用相關的東西?爲什麼ISomeBaseInterface
@Vladimir:原始類型是具有省略類型參數的泛型類型。非泛型類不是原始類型,因此它不具有原始類型的典型效果。 – axtavt
這是正確的行爲嗎?如果SomeDerivedClass被用作原始類型,爲什麼需要在SomeDerivedClass中使用SomeAbstractClass