当前位置: 首页 > 知识库问答 >
问题:

接口和类。名称冲突:相同的擦除,但都不覆盖其他

邹海荣
2023-03-14

我有一个接口,当我尝试实现它的一个方法时,我得到了这个错误:“名称冲突:GenericQueue中的enqueue(T#1)和IGenericQueue中的enqueue(T#2)具有相同的擦除,但两者都不重写另一个,其中T#1,T#2是类型变量:T#1扩展在类GenericQueue中声明的Comparable T#2扩展在接口IGenericQueue中声明的Comparable”下面是代码:

public interface IGenericQueue <T extends Comparable> {
public void enqueue(T j);
..
}

public class GenericQueue<T extends Comparable> implements IGenericQueue {
....

public void enqueue(T j) // the error is in this line.
{
    if(rear == maxSize -1)
        rear = -1; // means you have reached the last element start again ?

    queArray[++rear] = j;
    nItems ++ ;
}
}

共有3个答案

巴宏恺
2023-03-14

功能界面-

Lambda Expersion公司

您需要首先了解LamdaExpersion的概念,然后才能轻松了解函数接口角色。。

// Java program to demonstrate lambda expressions 
// to implement a user defined functional interface. 

// A sample functional interface (An interface with 
// single abstract method 
interface FuncInterface 
{ 
    // An abstract function 
    void abstractFun(int x); 

    // A non-abstract (or default) function 
    default void normalFun() 
    { 
    System.out.println("Hello"); 
    } 
} 

class Test 
{ 
    public static void main(String args[]) 
    { 
        // lambda expression to implement above 
        // functional interface. This interface 
        // by default implements abstractFun() 
        FuncInterface fobj = (int x)->System.out.println(2*x); 

        // This calls above lambda expression and prints 10. 
        fobj.abstractFun(5); 
    } 
} 

Lambda Expersion只有在您的Define接口只有1个方法Define时才起作用,因为java编译器只理解接口中只有一个方法的情况,所以您不需要在类中定义该方法,因此:Anotation出现在图中,当您要实现Lambda Expersion时,那么use必须在您的接口中使用FunctionInterface。若您错误地在接口中编写了另一个方法,那个么编译器会告诉您这是函数接口。只有定义一种方法才能在应用程序中使用Lamda Expersion

    @FunctionalInterface  
interface sayable{  
    void say(String msg);  
}  
public class FunctionalInterfaceExample implements sayable{  
    public void say(String msg){  
        System.out.println(msg);  
    }  
    public static void main(String[] args) {  
        FunctionalInterfaceExample fie = new FunctionalInterfaceExample();  
        fie.say("Hello there");  
    }  
}  
杜鸿彩
2023-03-14

我也遇到了类似的问题,尽管我有一个更复杂的泛型类层次结构,它遵循面向对象编程的模板模式。如果有一个接口,然后是扩展该接口的另一个接口,然后是实现该接口的抽象类,然后是扩展该抽象类的类,但是得到了错误“接口和一个类。名称冲突:相同的擦除,但都不重写其他”,并且发现只有当我在层次结构中的每个类以及对该类的每个引用中放置或在其后面时,错误才会消失。例如:

public interface Set<U> {...}
public interface SetExtended<U> extends Set<U> {...}
public abstract class AbstractSetExtended<U> implements SetExtended<U>{...}
public class Set1<U> extends AbstractSetExtended<U> {...}
public class Set2<U> extends AbstractSetExtended<U> {...}

模板模式对于模块化设计、分解常见代码以及代码重用非常有用。要进一步了解模板模式,请执行以下操作:https://en.wikipedia.org/wiki/Template_method_pattern

糜凯泽
2023-03-14

您的GenericQueue正在实现原始接口IGenericQueue,因此它的TIGenericQueue中的T不同。添加

public class GenericQueue<T extends Comparable> implements IGenericQueue<T> {
//                                                                      ^^^

因此,您正在使用相同的T实现通用接口。

 类似资料:
  • 问题内容: 我有一个接口,当我尝试实现其方法之一时,出现以下错误:“名称冲突:GenericQueue中的enqueue(T#1)和IGenericQueue中的enqueue(T#2)具有相同的擦除,但是没有覆盖T#1,T#2是类型变量的另一个:T#1扩展了在类GenericQueue中声明的Comparable T#2扩展了在接口IGenericQueue中声明的Comparable,这是代码

  • 问题内容: 我收到此名称冲突错误,我不知道该怎么解决。我有两个类,我正在使用重载的方法“ createSensors”。为了简化,这里是产生问题的代码: 问题答案: 通用解决方案是使用不同的名称。这些方法可以在没有继承关系的类中,因为它们不是实例方法。 如所指出的,问题中的方法实现是相同的(典型值除外)。 (此重载问题经常与擦除运行时类型混淆。重载是链接时而非动态问题,因此可以在语言中轻松解决。这

  • 问题内容: 我想要一个带有Real的compareTo方法(一个用于处理任意大而精确的实数的类[好吧,只要它现在的长度小于2 ^ 31])和一个带有一个对象,但是Java不允许我这样做,而且我还没有足够的经验来知道为什么。 我只是试图修改该类以实现Comparable,并且在下面得到了这些错误消息。我不是很明白错误消息的含义,但是我知道这与我试图为类制作的每个方法提供所有不同方法签名的灵活性的可怕

  • 我正在尝试理解使用以下代码得到的名称冲突错误: 错误消息: 错误:名称冲突:

  • 问题内容: 我在这里已经读到,在Java中,具有相同名称但不同类型的两个变量可以在同一范围内共存。我的意思是这个 但是所有的Java IDE都不允许这样的代码。我想知道这样的代码在语法上是否正确,或者只是IDE不允许这样的代码防止歧义。 无论如何,这是网站的摘录 “如果幸运的话,您也许能够重新编译Jad的输出。 但是,Java VM对于变量命名的规则比Java语言本身更为宽松。例如,一个有效的类文