Nano Hash - криптовалюты, майнинг, программирование

Реализация метода интерфейса Java в Scala

Моя реализация метода getHandler, определенного в интерфейсе Java, потерпела неудачу, и я не знаю, почему. Вот сигнатура метода:

<H extends EventHandler> H getHandler( Type<H> type, int index );

Моя реализация в Scala:

def getHandler[H <: com.google.gwt.event.shared.EventHandler]
    (aType: Type[H], index: Int): H 
    = new com.google.gwt.event.shared.EventHandler() {}

... но компилятор выдает мне это сообщение:

type mismatch;  
    found: java.lang.Object with com.google.gwt.event.shared.EventHandler
    required: H

Где я ошибся?

01.09.2010

Ответы:


1

Я думаю, что это может заставить его скомпилироваться:

def getHandler[H <: com.google.gwt.event.shared.EventHandler]
    (aType: Type[H], index: Int): H = {
  val h = new com.google.gwt.event.shared.EventHandler() {}
  h.asInstanceOf[H]
}

Ожидается H. Как говорит Лахлан, aType возможно где-то нужен.

01.09.2010
  • ...и даже более кратко: новый com.google.gwt.event.shared.EventHandler() {}.asInstanceOf[H] 01.09.2010
  • Это может заставить его скомпилироваться, но это ужасный совет. Код неверный и вызовет проблемы, если будет реализован таким образом. 01.09.2010
  • Да, согласен, как совет это ужасно. Я просмотрел docjar.com/html. /api/com/google/gwt/event/shared/ и решил, что просто отвечу, почему не компилируется. Мне плохо, что это принятый ответ. 02.09.2010

  • 2

    Я думаю, это потому, что ваша реализация не поддерживает контракт интерфейса. H может быть любым подтипом EventHandler, определяемым типом аргумента aType. Но ваша реализация всегда возвращает один и тот же анонимный подтип EventHandler, независимо от того, что передается в качестве аргумента aType.

    Я не знаю, какой была бы правильная реализация, но я не вижу, как это можно было бы реализовать без использования параметра aType.

    01.09.2010

    3

    Добавляя к ответ Лахлана, я хотел бы указать выходит, что простое приведение типа возвращаемого значения к ожидаемому может иметь катастрофические последствия.

    Рассмотрим следующую реализацию, в которой я использовал именованный класс вместо анонимного внутреннего класса из вопроса:

    class MyHandlerA extends EventHandler
    class MyHandlerB extends EventHandler
    
    object BadImplementation extends I {
      def getHandler[H <: EventHandler](typ : Type[H], index: Int) = {
        (new MyHandlerA).asInstanceOf[H] // BAD: This asInstanceOf is a lie!
      }
    }
    

    Следующая строка вызовет ClassCastException без предупреждения.

    val b: MyHandlerB = BadImplementation.getHandler(new Type[MyHandlerB] {} , 0)
    

    Таким образом, в дополнение к приведению реализация должна будет гарантировать, что возвращаемый обработчик действительно может быть назначен H или возвращать null, или генерировать исключение.

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

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..