2013-10-15 3 views
3

hi im новичок в этом и им пытаются реализовать класс для интерфейса. Интерфейс расширяет другой интерфейс. Я создаю класс с методами для запуска через список и вмешиваюсь в него, эти два интерфейса отличаются от этого., реализующий интерфейс для класса: класс для интерфейса к интерфейсу

Эти два интерфейса находятся в каждом отдельном файле, но все в одном пакете, надеемся, что это правильно.

Im получая следующие ошибки:

Из класса doublelinkedlist: interface expected here

Из интерфейса A: doublelinkedlist.A is already defined in doublelinkedlist, interface expected here

Из интерфейса B: doublelinkedlist.B is already defined in doublelinkedlist

класс Код:

package doublelinkedlist; 

import java.util.*; 

public class Doublelinkedlist<T> implements A<T> 
{ 

код интерфейса A: (в отдельном файле с именем A.java)

package doublelinkedlist; 

import java.util.Iterator; 


public class A<T> { // am I supposed to have a class here? or just have the interface? 

    public interface A<T> extends B<T> 
    { 

код интерфейса B: (в отдельном файле с именем B.java)

package doublelinkedlist; 

public class B<T> { 

    public interface B<T> extends Iterable<T> 
    { 

Там нет кода для двух интерфейсов в классе, поэтому я не понимаю, почему я получаю сообщение об ошибке, которое уже определено. Кто-нибудь понял?

+3

Интерфейс не может распространяться на класс, только с других интерфейсов. Класс не может простираться от интерфейса, как раз из одного нечетного класса. Класс может реализовать один или несколько интерфейсов. –

+2

@JeroenVannevel вы можете объявить внутренние интерфейсы/классы внутри класса, в этом нет ничего плохого. –

ответ

4

interface expected here указывает на то, что компилятор ожидает интерфейс после implements, где вы дали ему класс (поскольку на первом месте была заявка на номер class A<T>).

doublelinkedlist.A is already defined in doublelinkedlist, interface expected here выбрасывается, потому что у вас есть класс с именем A и интерфейс внутри класса с именем A, они не могут оба имеют одинаковое имя (то же с B)

В то время как вы можете технически иметь интерфейс внутри класс, это на самом деле не лучший дизайн (поскольку интерфейсы были предназначены для абстрактного или скрытия деталей базовых классов, они, как правило, более заметны), поэтому старайтесь избегать этого, если у вас нет веской причины :)

Это, вероятно, то, что вы ищете:

Doublelinked list.java:

package doublelinkedlist; 

import java.util.*; 

public class Doublelinkedlist<T> implements A<T> 
{...} 

A.java:

package doublelinkedlist; 

import java.util.Iterator; 

public interface A<T> extends B<T> 
{...} 

B.java:

package doublelinkedlist; 

public interface B<T> extends Iterable<T> 
{...} 

Далее чтение на интерфейсах: http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html

0
public class A<T> { // am I supposed to have a class here? or just have the interface? 

public interface A<T> extends B<T> 
{ 

Это однозначно. Является ли интерфейс или класс?

Только интерфейсы могут быть «реализованы». Вы не можете реализовать класс.

Так что я думаю, ваш вопрос будет сделано путем изменения те в:

Файл DoubleLinkedList.java:

public class Doublelinkedlist<T> implements A<T> 
{ 
// ... blah blah 
} 

-> В класс реализует интерфейс A A.java

файла:

public interface A<T> extends B<T> 
{ 
    // ... 
} 

-> Inte rface расширяет интерфейсную Аргументы B

Файл B.java:

public interface B<T> extends Iterable<T> 
{ 
    // ... 
} 

-> Интерфейс расширяет интерфейс Iterable

0
public interface Entity{ 

public int getId(); 
public void setId(int id); 
public int getHealth(); 
public void setHealth(int health); 
} 

public class Tank implements Entity{ 

//without implementing the methods mentioned in Entity you will immediately see a red line //under "Tank" in your IDE saying un-implemented methods. 
} 
public class Tank implements Entity{ 
private int id; 
private int health; 

public Tank(){..} 
public int getId(){ 
return id; 
} 
public void setId(int id){ 
this.id = id; 
} 
public int getHealth(){ 
return health; 
} 
public void setHealth(int health){ 
this.health = health; 
} 
} 

интерфейс является контракт между классом, который реализует интерфейс, он говорит: «ЭТО ВЫ, вы подписались, чтобы использовать меня, чтобы вы лучше использовали эти методы и правильно определили их».

Интерфейс будет описывать только заголовки методов, но на самом деле не предлагать ему какой-либо контент, он предоставляется классу, который реализует интерфейс.

более подробно понимать следующее inheritence - позволяет классу наследовать атрибуты и методы его родительского класса, но один и тот же дочерний класс не может наследовать непосредственно из 2 родительских классов, однако вы можете наследовать дочерний класс из родительский класс, который наследует от другого класса, который реализует интерфейс. вот пример

public interface Entity{ 
    ... 
    } 
    public Soldier implements Entity{ 
    // implements the entity interface, 
    //and defines the methods 
    } 
    public SwordsMan extends Soldiers{ 
    //this class inherits the methods and attributes of soldier 
    //which had also implemented the methods from entity 

} 

Вы также упомянуть, пытаясь расширить интерфейс в интерфейс, интерфейсы разработаны без каких-либо реализованных методов, если вы хотите использовать два интерфейса вы лучше сделать это:

public class Aircraft implements Engine, Entity{ 
//this class then has to implements all methods from Engine and Entity 
} 
Смежные вопросы