Можете ли вы получить тип общей переменной [duplicate]

  1. Используйте это: URLEncoder.encode (query, StandardCharsets.UTF_8.displayName ()); или это: URLEncoder.encode (запрос, «UTF-8»);
  2. Вы можете использовать следующий код.
    String encodedUrl1 = UriUtils.encodeQuery(query, "UTF-8");//not change 
    String encodedUrl2 = URLEncoder.encode(query, "UTF-8");//changed
    String encodedUrl3 = URLEncoder.encode(query, StandardCharsets.UTF_8.displayName());//changed
    
    System.out.println("url1 " + encodedUrl1 + "\n" + "url2=" + encodedUrl2 + "\n" + "url3=" + encodedUrl3);
    
6
задан Shepmaster 11 January 2017 в 19:38
поделиться

1 ответ

Идиоматическое решение

Создайте признак, который сдерживает параметр T в foo, реализует любое конкретное поведение как ассоциированную функцию этого признака.

Пример:

trait PrintMe {
    fn print_me(&self);
}

impl PrintMe for String {
    fn print_me(&self) { println!("I am a string"); }
}

struct Foo<T: PrintMe> {
    zaz: String,
    bar: T
}

fn main() {
    // ...
    x.bar.print_me();
}

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


Точное решение

Rust действительно может запрашивать типы: каждый тип имеет уникальный TypeId , и вы можете сопоставлять TypeId с серией проверок if , Это неуклюже.

fn print_me<T>(x: &Foo<T>) {
    if TypeId::of::<T>() == TypeId::of::<String>() {
        println!("I am a string");
    } else // ...
}

Но, пожалуйста ... не делайте этого:)

11
ответ дан Shepmaster 19 August 2018 в 18:34
поделиться
  • 1
    Спасибо, Маттье. Это проясняет ситуацию. Я думаю, мне нужно изменить свой дизайн в целом, я продолжаю выкладывать свой код «C style». Благодаря! – Dash83 11 January 2017 в 22:37
  • 2
    +1 для «не делают этого», и я просто укажу, что Rust имеет enum, что является лучшим (более коротким, четким, идиоматическим и проверенным временем) способом написания всех этих TypeId::of проверок. – trentcl 11 January 2017 в 23:52
  • 3
    @trentcl: Это зависит. enum для закрытого полиморфизма, тогда как trait для открытого полиморфизма ... если это имеет смысл. – Matthieu M. 12 January 2017 в 08:35
  • 4
    @MatthieuM. Это имеет смысл. Вы уже упоминали о чертах, поэтому я решил указать на другое решение – trentcl 12 January 2017 в 16:29
Другие вопросы по тегам:

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