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);
Идиоматическое решение
Создайте признак, который сдерживает параметр 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 // ...
}
Но, пожалуйста ... не делайте этого:)
enum
, что является лучшим (более коротким, четким, идиоматическим и проверенным временем) способом написания всех этихTypeId::of
проверок. – trentcl 11 January 2017 в 23:52enum
для закрытого полиморфизма, тогда какtrait
для открытого полиморфизма ... если это имеет смысл. – Matthieu M. 12 January 2017 в 08:35