2013-10-15 3 views
2

Я изо всех сил пытаюсь разобраться с Java. Как использовать метод giveCode(), чтобы вернуть целочисленное значение для объекта. Это код, который был предварительно написан нашим лектором, и мы должны использовать его для возврата целочисленного значения для объекта, его нужно использовать при создании хэш-значений для хеш-таблицы.Использование интерфейсов внутри классов в Java

HashCode.java

// Interface for HashCode. Has only one method declaration 
public interface HashCode { 

    // For an input object, computes and returns its HashCode as an integer 
     public int giveCode(Object o); 

} 

StringHashCode.java (Я создал этот класс, как мы должны реализовать класс Hashcode в этом классе)

public abstract class StringHashCode implements HashCode{ 


} 

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

System.out.println(new StringHashCode.giveCode(example_object)); 

Или

System.out.println(new StringHashCode.giveCode(example_object.hashCode())); 

Или

System.out.print(HashCode.giveCode(example_object)); 

Я совершенно новой для Java, но у меня есть большой опыт работы с другими языками объектно-ориентированного программирования, но я не могу понять проблемы с этим один, я чувствую, что это, наверное, что-то глупое, но я не могу это обсуждать.

+1

Что означает _not working_? Каковы ваши ожидания и каковы фактические результаты? –

+0

Вы не можете создавать экземпляры абстрактного класса. Вам нужен конкретный класс. Ваши примеры даже не будут компилироваться. Я предлагаю вам написать код, который будет скомпилирован первым. –

+0

Вам не хватает двух очень важных символов, называемых скобками: 'new StringHashCode()' –

ответ

1

Поскольку ваш лектор дал вам этот интерфейс, вы должны его реализовать. И это может быть класс. Это может быть другой интерфейс, который вам может не понадобиться, абстрактный класс не подходит для вашего решения, поэтому используйте простой класс и реализуйте этот интерфейс.

class HashCodeImpl implements HashCode { 
    @Overwide 
    public int getCode(Object obj) { 
     return obj.hashCode(); 
    } 
} 

и основной метод этого класса hould быть использованы в качестве

class Main { 
    public static void main(String[] args){ 
     HashCodeImpl impl = new HashCodeImpl(); 
     System.out.println(impl.getCode(new String())); 
    } 
} 

Теперь в вашем вопросе я не знаю, как вы не получаете никакого вывода, поскольку ни один из вашей системы из не будет компилироваться.

System.out.println(new StringHashCode.giveCode(example_object)); 

метод giveCode этого класса не является статическим, так что это не будет компилировать

System.out.println(new StringHashCode.giveCode(example_object.hashCode())); 

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

System.out.print(HashCode.giveCode(example_object)); 

Ошибка компиляции, поскольку HashCode представляет собой интерфейс, как прототип, который вы должны реализовать для создания конкретного класса.

+2

, который должен быть '@ Override', конечно, если вы не Элмер Фадд ... – ajb

+0

Ха-ха, я собрал. Проблема, с которой я столкнулся, заключается в том, что когда я делаю класс не абстрактным классом, он говорит мне, что класс должен быть абстрактным или переопределенным. Но даже когда я добавляю ваше переопределение, он говорит мне то же самое и дает мне ошибку для переопределения. –

+1

@ConnerStephenMcCabe Для переопределения тип возвращаемого значения и типы параметров должны быть точно такими же (за исключением ковариации, которая здесь не применяется). Вы пытались переопределить что-то объявленное _exactly_ как «public int giveCode (Object o)»? Постскриптум Похоже, что ответчик ошибся в 'getCode', поэтому, если вы вырезаете и вставляете его, это будет неправильно. – ajb

0
  1. Сделать класс неабстрактный
  2. Написать реализацию метода
  3. Вы недостающую скобка

исправить эти проблемы, и он будет работать лучше для вас.

public class StringHashCode implements HashCode{ 

    public int giveCode(Object o) { 
     return o.hashCode(); // Replace this with your own implementation 
    } 
} 


System.out.println(new StringHashCode().giveCode(example_object)); 
+0

Раздел giveCode не является методом, насколько мне известно, это просто переменная, объявленная с целым значением объекта. Также. возвращение 42 было бы бесполезным, так как возвращаемый код должен быть уникальным. –

+0

@ConnerStephenMcCabe Раздел giveCode ** представляет собой ** метод в интерфейсе 'HashCode' в вопросе OP. И это определенно ** не ** переменная. Разумеется, в возвращении 42 нет смысла, который был предназначен как «// TODO: Replace с вашей собственной реализацией», но я изменил это сейчас, чтобы использовать реализацию, которая имеет гораздо больше смысла. –

+0

@ConnerStephenMcCabe Извините, теперь я понял, что вы OP. Что заставляет вас думать, что giveCode - «thingy» - это не метод? Когда он объявлен таким образом в интерфейсе, он указывает, что все экземпляры интерфейса должны содержать этот метод. –

0
  1. Вы пытаетесь создать экземпляр класса без использования() s. Вы бы хотели new StringHashCode().
  2. Вы пытаетесь создать экземпляр абстрактного класса, что невозможно.
  3. Вы не реализовали метод giveCode в любом месте, поэтому, естественно, вы не можете его назвать.
Смежные вопросы