Встраивание actix-web в структуру, чтобы я мог запускать / останавливать сервер

Методы с varargs (...) имеют самый низкий приоритет, когда компилятор определяет, какой перегруженный метод выбрать. Поэтому TestOverload(int i) выбирается над TestOverload(char... c), когда вы вызываете TestOverload с одним параметром char 'a', так как char можно автоматически повысить до int.

JLS 15.12.2 :

  1. Первая фаза (§15.12.2.2) выполняет разрешение перегрузки без разрешения преобразования бокса или распаковки или использования метода переменной arity призывание. Если на этом этапе не обнаружен какой-либо применимый метод, обработка продолжается до второй фазы. Это гарантирует, что любые вызовы, которые были действительны на языке программирования Java до Java SE 5.0, не считаются неоднозначными в результате внедрения методов переменной arity, неявного бокса и / или распаковки. Однако объявление метода переменной arity (§8.4.1) может изменить метод, выбранный для выражения вызова метода данного метода, поскольку метод переменной arity рассматривается как метод фиксированной arity в первой фазе. Например, объявление m (Object ...) в классе, который уже объявляет m (Object), приводит к тому, что m (Object) больше не выбирается для некоторых выражений вызова (таких как m (null)), как m (Object []) ) более конкретно.
  2. Вторая фаза (§15.12.2.3) выполняет разрешение перегрузки при разрешении бокса и распаковки, но все же исключает использование вызова метода переменной arity. Если на этом этапе не обнаружен какой-либо применимый метод, обработка продолжается до третьей фазы. Это гарантирует, что метод никогда не выбирается с помощью вызова метода переменной arity, если он применим посредством вызова метода фиксированной arity.
  3. Третья фаза (§15.12.2.4) позволяет перегрузке сочетаться с различными способами arity, бокс , и unboxing.
blockquote>

EDIT:

Вы хотите заставить компилятор вызвать конструктор TestOverload(char... c), вы можете перейти к вызову конструктора a char[]:

new TestOverload (new char[] {'a'});

0
задан ddibiase 16 January 2019 в 03:18
поделиться

1 ответ

HttpServer является общей структурой , а не чертой (поэтому «T: HttpServer» не имеет смысла).

Вы можете создать общую структуру, которая содержит совершенно произвольную реализацию HttpServer (это, вероятно, не очень полезно для вас):

struct CustomServer<H: IntoHttpHandler + 'static, F: Fn() -> H + Send + Clone + 'static> {
    srv: HttpServer<H, F>,
}

impl<H: IntoHttpHandler + 'static, F: Fn() -> H + Send + Clone + 'static> CustomServer<H, F> {
    fn new(factory: F) -> CustomServer<H, F> {
        CustomServer {
            srv: HttpServer::new(factory),
        }
    }
}

или конкретную структуру, которая содержит особый вид HttpServer (Полагаю, это то, что вам нужно, хотя трудно сказать без подробностей вашего варианта использования):

struct CustomServer {
    srv: HttpServer<App, fn() -> App>,
}

impl CustomServer {
    fn new() -> CustomServer {
        CustomServer {
            srv: HttpServer::new(|| App),
        }
    }
}

Есть также много точек между ними (например, специализация H ], но не F, или немного специализироваться на основе других общих параметров), в зависимости от того, что вы пытаетесь сделать.

0
ответ дан Anders Kaseorg 16 January 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: