Методы с varargs (...
) имеют самый низкий приоритет, когда компилятор определяет, какой перегруженный метод выбрать. Поэтому TestOverload(int i)
выбирается над TestOverload(char... c)
, когда вы вызываете TestOverload
с одним параметром char
'a'
, так как char
можно автоматически повысить до int
.
blockquote>
- Первая фаза (§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 []) ) более конкретно.
- Вторая фаза (§15.12.2.3) выполняет разрешение перегрузки при разрешении бокса и распаковки, но все же исключает использование вызова метода переменной arity. Если на этом этапе не обнаружен какой-либо применимый метод, обработка продолжается до третьей фазы. Это гарантирует, что метод никогда не выбирается с помощью вызова метода переменной arity, если он применим посредством вызова метода фиксированной arity.
- Третья фаза (§15.12.2.4) позволяет перегрузке сочетаться с различными способами arity, бокс , и unboxing.
EDIT:
Вы хотите заставить компилятор вызвать конструктор
TestOverload(char... c)
, вы можете перейти к вызову конструктора achar[]
:new TestOverload (new char[] {'a'});
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
, или немного специализироваться на основе других общих параметров), в зависимости от того, что вы пытаетесь сделать.