powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как все-таки в scala возвратить честный null?
10 сообщений из 10, страница 1 из 1
Как все-таки в scala возвратить честный null?
    #38994455
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, как в скале возвратить нормальный null? Допустим это нужно т.к. этого требует интерфейс. Или, например, использовать из java-кода. Или еще что-нибудь в этом роде.

Код: java
1.
2.
3.
4.
5.
class MyCoolClass[T] {
  def func(x:Double):T ={
    null //тут компилятор ругается
  }
}
...
Рейтинг: 0 / 0
Как все-таки в scala возвратить честный null?
    #38994457
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
придумал, но способ кривоват.
Нужно сделать java-класс хелпер со статическим методом отдающим null

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
//java-класс
public class NullVal<T> {
    public static <T> T getNull(){return null;}
}

//и тогда в скале юзать так:
def func(x:Double):T ={
NullVal.getNull()
}
...
Рейтинг: 0 / 0
Как все-таки в scala возвратить честный null?
    #38994594
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokПодскажите, как в скале возвратить нормальный null? Допустим это нужно т.к. этого требует интерфейс. Или, например, использовать из java-кода. Или еще что-нибудь в этом роде.

Код: java
1.
2.
3.
4.
5.
class MyCoolClass[T] {
  def func(x:Double):T ={
    null //тут компилятор ругается
  }
}



Компилятор правильно ругается. В Скале параметр дженерика может быть и Value-типом.
В интернетах говорят, что правильно вот так:

Код: java
1.
2.
3.
4.
5.
class MyCoolClass[T >: Null] {
  def func(x: Double): T = {
    null;
  }
}
...
Рейтинг: 0 / 0
Как все-таки в scala возвратить честный null?
    #38994606
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, так прокатило. Спасибо.

Понять бы еще, почему это работает. В скале Null наследован от AnyRef
И (насколько мне кажется), раз >: накладывает ограничение, что T должно быть надтипом Null, то такой класс неполучится параметризовать ничем другим, кроме как Null или AnyRef.

Но я попробовал -- его получается параметризовать любым моим классом. Т.е., значит, я не понял что означает >:, несмотря на то, что весь день гуглил про type bounds.
...
Рейтинг: 0 / 0
Как все-таки в scala возвратить честный null?
    #38994723
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok,

Действительно, не всё так просто.

http://stackoverflow.com/questions/2336204/how-scala-generic-constraints-to-nullable-types-work

авторJust because something extends AnyRef doesn't mean it must be nullable. For instance, Nothing is a subtype of AnyRef, and it is not nullable.

The other way around is similar, because Any is a supertype of Null, and any Int is also an Any

Null - подтип любого AnyRef, поэтому ">:" тут логичен - наш T должен быть надтипом Null (но не только его, поэтому допустимы и другие значения кроме null).

И совсем правильно вот так :)

Код: java
1.
2.
3.
4.
5.
class MyCoolClass[T >: Null <: AnyRef] {
  def func(x:Double): T = {
    null;
  }
}
...
Рейтинг: 0 / 0
Как все-таки в scala возвратить честный null?
    #38995425
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез, спасибо.

Кажется начинаю понимать... Гипотеза такая. Null наследуется немножко нетрадиционным путем: он наследован от каждого пользовательского класса. Таким образом, первый предок у него - это будет не AnyRef, а наш класс.
Тогда с >: все логично. Тут наверное раз зашла такая тема, прикреплю картинки.

Но мне все еще неясно, что дает добавление <: AnyRef?

И сразу камень в мою гипотезу. По такой логике class MyCoolClass[T >:Nothing <: Any ] должно было бы позволить создать MyCoolClass[Double] и возвращать null вместо Double. Но нет. Не позволяет. Значит пока я еще не понял в полной мере как оно работает.

Кстати, тоже вопрос. Если есть код java который хочет вызвать функцию, которая возвращает Double или null, а этот код надо сделать на скале. Как такое сделать?

...
Рейтинг: 0 / 0
Как все-таки в scala возвратить честный null?
    #38995431
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, вопрос про сопряжение с java снимается. Если мы хотим вернуть или Double или null, то можно сделать так:

Код: java
1.
def func():java.lang.Double = {null}
...
Рейтинг: 0 / 0
Как все-таки в scala возвратить честный null?
    #38995560
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokПодскажите, как в скале возвратить нормальный null?

Наиболее правильное решение - найти в Интернете форум про Scala и там задавать свой вопрос, а не шокировать этим словом публику в приличном форуме, не имеющем отношения к Scala.
...
Рейтинг: 0 / 0
Как все-таки в scala возвратить честный null?
    #38995630
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokДиез, спасибо.

Кажется начинаю понимать... Гипотеза такая. Null наследуется немножко нетрадиционным путем: он наследован от каждого пользовательского класса. Таким образом, первый предок у него - это будет не AnyRef, а наш класс.
Тогда с >: все логично. Тут наверное раз зашла такая тема, прикреплю картинки.

Но мне все еще неясно, что дает добавление <: AnyRef?


Ограничение, чтобы какой-нибудь AnyVal нельзя было подставить. Вот, например:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
class MyCoolClass[T >: Null] {
  def func(x: Option[T]): T = {
    x.getOrElse(null);
  }
}

  val obj = new MyCoolClass[Any]();
  val res = obj.func(Some(1.0)); 



- код компилируется, причем res в итоге имеет тип java.lang.Double, что логично с точки зрения JVM, но ломает задачу.
"<: AnyRef" не допустит такой ситуации.

chabapokИ сразу камень в мою гипотезу. По такой логике class MyCoolClass[T >:Nothing <: Any ] должно было бы позволить создать MyCoolClass[Double] и возвращать null вместо Double. Но нет. Не позволяет. Значит пока я еще не понял в полной мере как оно работает.



Как я понимаю, [T >:Nothing <: Any] полностью эквивалентно [T]. Собственно, возвращаемся к самому первому вопросу :)
...
Рейтинг: 0 / 0
Как все-таки в scala возвратить честный null?
    #38995636
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan MchabapokПодскажите, как в скале возвратить нормальный null?

Наиболее правильное решение - найти в Интернете форум про Scala и там задавать свой вопрос, а не шокировать этим словом публику в приличном форуме, не имеющем отношения к Scala.

Ну, мы тут обсуждаем вопрос неподсредственной интеграции с Java, а не языка Scala как такового.

Но если вы считаете, что эта тема неприемлема для данного форума, всегда можете сообщить модераторам, они разберутся :)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как все-таки в scala возвратить честный null?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]