Java不能用不同的参数继承
我在实际继承接口时遇到问题。我总是以错误告终 错误:无法使用不同的参数继承NameableContainer:Java不能用不同的参数继承,java,Java,我在实际继承接口时遇到问题。我总是以错误告终 错误:无法使用不同的参数继承NameableContainer:和 我有以下接口: public interface Nameable public interface Name public interface Friend extends Nameable public interface NameableContainer<T extends Nameable> { void add(Name name, Name p
public interface Nameable
public interface Name
public interface Friend extends Nameable
public interface NameableContainer<T extends Nameable> {
void add(Name name, Name prevName);
void remove(Nameable nameable);
T findByName(Name name);
}
public interface FriendContainer extends NameableContainer<Friend>
最后,试着把这些放在一起
public class Friends extends NameableMap implements FriendContainer
我遗漏了什么?当你说
public abstract class NameableMap implements NameableContainer
这就把编译器中的所有东西都扔掉了;原始类型是错误的,除非您的代码最初是为Java1.4或更早版本编写的。当实现指定类型参数的接口时,需要提供具体类型,或者如果还不知道具体类型,可以引入另一个类型参数并将其传递给超类型
请参阅:
因此,在实现namablecontainer
时指定一个变量泛型类型参数(因为您还不知道具体的类型,因为namablemap
也应该适用于所有namables)
public abstract class NameableMap<T extends Nameable> implements NameableContainer<T>
// ^^^^^^^^^^^^^^^^^^^^ ^^^
公共抽象类namablemap实现namablecontainer
// ^^^^^^^^^^^^^^^^^^^^ ^^^
当您说
public abstract class NameableMap implements NameableContainer
这会使编译器中的所有内容都失效;原始类型是错误的,除非您的代码最初是为java 1.4或更早版本编写的。当您实现指定类型参数的接口时,您需要提供具体类型,或者如果还不知道具体类型,您可以引入另一个类型参数并将其传递给超类型
请参阅:
因此,在实现namablecontainer
时指定一个变量泛型类型参数(因为您还不知道具体的类型,因为namablemap
也应该适用于所有namables)
public abstract class NameableMap<T extends Nameable> implements NameableContainer<T>
// ^^^^^^^^^^^^^^^^^^^^ ^^^
公共抽象类namablemap实现namablecontainer
// ^^^^^^^^^^^^^^^^^^^^ ^^^
将整个程序中的所有代码移到一个类中,并将其放在一行上将整个程序中的所有代码移到一个类中,并将其放在一行上如果要实现命名容器
,则需要提供一个实现命名
的类型参数。当前您没有这样做。如果重新实现namablecontainer
,您需要提供一个实现namablecontainer
的类型参数。目前您没有这样做。在这种情况下,使用原始类型确实会产生错误。不过,您仍然可以在其他代码中使用原始类型。不建议这样做。您可以使用原始类型,但它将始终引发编译器错误ff.非常不幸的是,在javac中,默认情况下这仍然不是一个错误,因为这是代码中许多难以跟踪的问题的原因。我已经添加了一个链接到关于这一点的深入问答。是的,他们允许原始类型的主要原因是因为兼容性。现在大多数代码都会转换为泛型,但我确信确实有直到生产中使用原始类型的代码。抱歉,我没有包含所有代码,这是我的错误。使用对NameableMap的更改编译时产生错误:NameableMap中的findByName(Name)无法实现findByName(Name)在NameableContainer中,返回类型Nameable与T#2不兼容,其中T#1,T#2是类型变量:T#1扩展了接口NameableContainer中声明的Nameable,T#2扩展了类NameableMap中声明的Nameable,但没有看到您的代码,我无法判断问题。也许您忘记了中的
实现了NameableContainer
。或者您在NameableMap
中的方法findByName
上引入了另一个方法局部类型变量。在这种情况下,使用原始类型确实会产生错误。不过,您仍然可以在其他代码中使用原始类型。这是不鼓励的。您可以使用原始类型,但它总是会使编译器失效。这真的很不幸在javac中,默认情况下这仍然不是一个错误,因为这是代码中许多难以跟踪的问题的原因。我已经添加了一个链接,指向关于这一点的深入问答。是的,他们允许原始类型的主要原因是兼容性。到目前为止,大多数代码都会转换为泛型,但我确信在生产中仍然有代码t使用原始类型。抱歉,我没有包含所有代码,这是我的错误。使用对NameableMap的更改进行编译会产生错误:NameableMap中的findByName(Name)无法实现findByName(Name)在NameableContainer中,返回类型Nameable与T#2不兼容,其中T#1,T#2是类型变量:T#1扩展了接口NameableContainer中声明的Nameable,T#2扩展了类NameableMap中声明的Nameable,但没有看到您的代码,我无法判断问题。也许您忘记了中的
实现了NameableContainer
。或者您在namablemap
中的方法findByName
上引入了另一个方法局部类型变量。