Rustのtypeという文が新しい型を作るものだと勘違いしていたのですが、少し気になったのでtypeを使ったコードを試してみました。
typeは型エイリアスで型の別名を作るものです。ただそれだけで元の型と同じに使えます。
型エイリアスは別名なので本質は同じ型と認識されるので、型エイリアスとオリジナルの型が一致していれば束縛可能です。
ただし、サフィックスには型エイリアスは使えないようです。
New Type Patternでtypeを使わないのは何故か?と思っていたのですがエイリアスなので別物として扱わないからなのですね。
struct AAA {}
struct BBB {}
struct DDD<T>(T);
type XX = i64;
fn f1(x: XX) -> XX {
x
}
type YY = XX;
type yy = XX;
fn f2(y: YY) -> XX {
y
}
fn f4<T>(z: T) -> T {
z as T
}
fn main() {
type ZZ = i64;
let a: ZZ = 1;
let b: i64 = a;
let c: YY = b as ZZ;
let e: XX = c as ZZ;
// let d: i64 = 2_yy; // ERROR
// let d: i64 = 3_YY; // ERROR
f1(4 as YY);
f2(5 as ZZ);
let f3 = |x: XX| -> ZZ { x as YY };
f4::<XX>(e);
f4::<yy>(e);
f4::<YY>(e);
f4::<ZZ>(e);
type CCC = AAA;
let aaa: AAA = AAA {};
let bbb: BBB = BBB {};
let ccc: CCC = AAA {};
let ccc: CCC = aaa;
let ddd: DDD<BBB> = DDD(bbb);
let ddd: DDD<XX> = DDD(11);
let eee: DDD<YY> = DDD(22);
let fff: DDD<ZZ> = DDD(33);
let ggg: DDD<ZZ> = ddd;
let hhh: DDD<XX> = eee;
let iii: DDD<YY> = fff;
// let eee: BBB = ccc; // ERROR
}