2009-11-08 2 views
2

У меня есть класс дерево, как это:Java: различные типы возвращаемых при перегрузке

master class abstract class Cell 
AvCell extends Cell 
FCell extends Cell 

У меня есть абстрактный метод getValue() в Cell

ли posibble сделать метод getValue() вернуть int для AvCell и String для FCell? Могу ли я использовать дженерики для intString?

Спасибо!

+3

Вы имеете в виду переопределение, а не перегрузку. –

ответ

0

Если я понимаю (изменение) вопрос правильно: Нет

Из Sun Java Tutorial:

перегруженные методы различаются по количеству и типу аргументов, передаваемых в метод. В примере кода draw (String s) и draw (int i) являются отличными и уникальными методами, потому что они требуют разных типов аргументов.

Вы не можете объявить несколько методов с тем же именем и одинаковыми номерами и типами аргументов, поскольку компилятор не может отличить их друг от друга. "

14

Вы могли бы использовать дженерики и объявить Cell<T> Тогда просто getValue() возвращение T

abstract class Cell<T> { 

    abstract T getValue(); 

} 

Сейчас:.

class AvCell extends Cell<Integer> { 
} 

и

class FCell extends Cell<String> { 
} 
+1

спасибо Yaneeve Я думаю, что это сработало – psergiu

+0

Я пытаюсь реализовать это, чтобы написать метод GCD, который может возвращать целое или длинное, основанное на типах ввода. Как я могу это реализовать? Я не получаю ничего. –

+0

@SpatieGames взглянуть на общие методы: http://docs.oracle.com/javase/tutorial/extra/generics/methods.html – Yaneeve

8

Вы можете, однако, сузить возвращаемый тип при подклассификации. Это называется «ковариантными типами возврата». Если метод в базовом классе возвращает T, вы можете переопределить этот метод в подклассе и вернуть его подкласс T.

1

Нет, перегрузка по типам возврата невозможна.

Вы можете объявить тип возвращаемого объекта как Object и возвращать Integer или String, если хотите.

1

Вы не можете это сделать обычно. У вас должны быть объявлены типы возврата, а возвращаемое значение должно быть объявленного типа или подтипа. Есть другие способы сделать это - объявить метод возвращаемого типа как объект и вернуть все, что вы хотите, но это НЕ путь.

Во-первых, очень простой вопрос: почему вы хотите возвращать разные типы на основе разных условий ввода? Вообще это должно быть потому, что вы делаете две разные вещи в методе, основанные на типе, который вы передаете. Это место, на которое нужно смотреть. Иметь разные методы для разных типов и вызывать один из них на основе типа. (И вы можете пойти дальше, используя заводские шаблоны ...)

0

Вы не можете перегрузить возвращаемый тип метода.JVM не знает, какой метод использовать, потому что подписи одинаковы.

Но вы можете вернуть Object с одним заполнением Integer и другой строкой.

8

Вы можете сделать следующее:

abstract class Cell<T> { 
    public abstract T getValue(); 
} 

class AvCell extends Cell<Integer> { 
    public Integer getValue() { 
     return 0; 
    } 
} 

class FCell extends Cell<String> { 
    public String getValue() { 
     return "foo"; 
    } 
} 
0

Да, JVM на самом деле это позволяет, так что это может быть сделано, если вы можете генерировать байт-коды правильно. Уловкой вы должны использовать другой инструмент, отличный от javac. Вот хороший учебник: http://today.java.net/pub/a/today/2008/07/31/return-type-based-method-overloading.html

Почему это важно? Мы построили библиотеку, но хотим изменить тип возврата из void на другое. К сожалению, для перекомпиляции требовалось, чтобы все приложения зависели от него. Управляя байтовыми кодами, старые приложения могут работать без перекомпиляции.