WedX - журнал о программировании и компьютерных науках

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

У меня очень простой пример как на java, так и на scala Java one:

public class LowerBound {

    public void myFunction(List<? super Integer> myList) {
        myList.forEach(System.out::println);
    }
}
public class LowerBoundMain {

    public static void main(String[] args) {

        LowerBound lb = new LowerBound();
        List<Integer> myList1 = new ArrayList<Integer>();
        myList1.add(1);
        myList1.add(2);
        myList1.add(3);

        lb.myFunction(myList1);

        List<Double> myList2 = new ArrayList<Double>();
        myList2.add(2.0);
        myList2.add(3.2);

        //lb.myFunction(myList2);
        
    }
}

здесь, как я и ожидал, lb.myFunction (myList2) выдает ошибку, потому что я жду List ‹Integer› или супертип List ‹Integer›, а List ‹Double› не является супертипом Integer

Но в Scala

class AnotherLowerBound {
  def myFunction[T >: List[Int]](input: T) = {
    println(input)
  }
}
object LowerBoundScalaMain extends App{

  val pos1 = new AnotherLowerBound
  val myList: List[Double] = List(2.32,4.31,3.54)
  pos1.myFunction(myList)

}

он печатает List [Double] без проблем? Является ли причиной того, что в Scala и List [Double], и ​​List [Integer] являются подтипом AnyRef? Или я ошибаюсь в синтаксисе?

15.10.2020

Ответы:


1
  1. Scala и Java имеют разные системы типов, они не должны вести себя одинаково

  2. в примере Java вы использовали экзистенциальный тип, в примере Scala вы использовали параметрический тип, так что это уже яблоки против апельсинов. Вам нужно будет определить подпись в Java как

     <T super Integer> void myFunction(List<T> myList)
    

    за исключением того, что это недействительный код Java

  3. Все структуры данных (кроме Array) инвариантны в Java, поэтому вывод типа не сможет определить наименьшую верхнюю границу двух разных типов. В Scala неизменяемые списки являются ковариантными, что позволяет при выводе типа обнаружить, что List[Int] и List[Double] относятся к типу List[AnyVal].

  4. List[AnyVal] - это тип, предполагаемый для вызова универсального метода Scala. Java не может этого сделать (он не позволяет определять параметр типа как ковариантный), поэтому он не может компилироваться, когда ему пришлось бы вывести общий супертип изменчивых List[Integer] и List[Double] Java для передачи значения как экзистенциального типа.

15.10.2020
Новые материалы

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

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]