65

我有一个接口,当我尝试实现它的一种方法时,我收到此错误:“名称冲突: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 ++ ;
}
}
4

3 回答 3

91

GenericQueue正在实现原始接口IGenericQueue,因此它TTin不同IGenericQueue<T>implements子句中添加:

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

所以你正在用相同的T.

于 2013-03-15T21:40:39.837 回答
2

我遇到了类似的问题,尽管遵循 OO 编程的模板模式,我有一个更复杂的通用类层次结构。哪里有一个接口,然后另一个接口扩展该接口,然后一个抽象类实现该接口,然后是扩展抽象类的类,但收到错误“接口和一个类。名称冲突:相同的擦除,但都没有覆盖其他”并发现只有当我在层次结构中的每个类以及对该类的每个引用中放置或之后,错误才会消失。例如:

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

于 2017-04-18T14:01:04.867 回答
1

功能接口 -> 首先,让我们了解一下@FuntionalInterface我们所知道的 JDK-1.8 的
一个新概念,即 Lambda Expersion 的概念:

Lambda 扩展

您需要了解有关 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 仅在您的定义接口只有1 个方法定义时才起作用,因为 java 编译器仅在接口中只有一个方法时才理解,那么您不需要在您的类中定义该方法,因此:注释出现在图片中,当您想要实施 Lambda Expersion 然后必须@FunctionInterface在您的界面中使用。如果你错误地在你的接口中多写了一个方法,那么编译器会告诉你这是函数式接口。只需定义一种方法才能在您的应用程序中使用 Lamda Experssion

    @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");  
    }  
}  
于 2019-01-14T08:13:49.020 回答