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

Код: java
1.
2.
3.
4.
5.
class MyCoolClass[T] {
  def func(x:Double):T ={
    null //тут компилятор ругается
  }
}
...
Рейтинг: 0 / 0
28.06.2015, 11:02
    #38994457
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как все-таки в scala возвратить честный null?
придумал, но способ кривоват.
Нужно сделать 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
28.06.2015, 22:55
    #38994594
Диез
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как все-таки в scala возвратить честный null?
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
29.06.2015, 00:56
    #38994606
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как все-таки в scala возвратить честный null?
Да, так прокатило. Спасибо.

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

Но я попробовал -- его получается параметризовать любым моим классом. Т.е., значит, я не понял что означает >:, несмотря на то, что весь день гуглил про type bounds.
...
Рейтинг: 0 / 0
29.06.2015, 10:38
    #38994723
Диез
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как все-таки в scala возвратить честный null?
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
29.06.2015, 21:59
    #38995425
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как все-таки в scala возвратить честный null?
Диез, спасибо.

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

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

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

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

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

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

Наиболее правильное решение - найти в Интернете форум про Scala и там задавать свой вопрос, а не шокировать этим словом публику в приличном форуме, не имеющем отношения к Scala.
...
Рейтинг: 0 / 0
30.06.2015, 10:27
    #38995630
Диез
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как все-таки в scala возвратить честный null?
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
30.06.2015, 10:29
    #38995636
Диез
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как все-таки в scala возвратить честный null?
Partisan MchabapokПодскажите, как в скале возвратить нормальный null?

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

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

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


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