Как правильно вернуть Void
тип, если он не является примитивом? Например. В настоящее время я использую null, как показано ниже.
interface B<E>{ E method(); }
class A implements B<Void>{
public Void method(){
// do something
return null;
}
}
java
generics
return-value
Роберт
источник
источник
Ответы:
Таким образом, будет достаточно любого из следующего:
Object
и возвратnew Object()
илиnull
Void
и возвратnull
NullObject
вашимВы не можете сделать этот метод
void
, и все остальное возвращает что - то . Поскольку это что-то игнорируется, вы можете вернуть что угодно.источник
return (Void)null;
В Java 8 появился новый класс
Optional<T>
, который можно использовать в таких случаях. Чтобы использовать его, вы должны немного изменить свой код следующим образом:Это позволяет вам гарантировать, что вы всегда будете получать ненулевое возвращаемое значение из вашего метода, даже если нечего возвращать. Это особенно эффективно при использовании в сочетании с инструментами, определяющими, когда
null
можно или нельзя возвращать, например Eclipse@NonNull
и@Nullable
аннотации.источник
Optional<Void>
не нужно по той же причине, что и вы, вы всегда получаетеOptional<Void>
пустой объект , поэтому все другие методы бессмысленны. Это противоположно тому, почему следует использовать необязательное значение. Вы используете его, потому что он может иметь или не иметь ценности. Также компилятор не может обеспечитьmethod()
правильную реализацию. Это потерпит неудачу во время выполнения:return Optional.of(null)
.Если вам просто ничего не нужно в качестве вашего типа, вы можете использовать void. Это можно использовать для реализации функций или действий. Затем вы можете сделать что-то вроде этого:
Или вы можете опустить абстрактный класс и вернуть значение null в каждом действии, которое не требует возвращаемого значения самостоятельно.
Затем вы можете использовать эти действия следующим образом:
Учитывая метод
Вы можете назвать это как
или для действия void (обратите внимание, что вы ничего не назначаете результат)
источник
Просто ради этого, конечно, есть возможность создать
Void
экземпляр с помощью отражения:Вы, вероятно, не сделаете этого в продакшене.
источник
Не существует универсального типа, который сообщал бы компилятору, что метод ничего не возвращает.
Я считаю, что соглашение заключается в использовании Object при наследовании в качестве параметра типа
ИЛИ
Разместите параметр типа вверх, а затем позвольте пользователям вашего класса создать экземпляр с помощью Object и назначить объект переменной, набранной с использованием подстановочного знака типа
?
:источник
A<?>
не сможет использовать возвращаемое значениеmethod()
.