В чём разница между расширяющимся преобразованием типов и сужающимся?

Есть ли какая то потеря данных при процессе использования этих преобразований?

Логично, что при сужении типа некоторые данные теряются, а при его расширении - данных наоборот становится больше.

Единственный момент ещё - это то, что расширающиеся преобразование может выполняться неявно, а сужающиеся обязательно нужно реализовывать явно

Пример расширяющего преобразования:

package com.company;

public class Main {
public static void main(String[] args) {
int big = 1234567890;
float approx = big;
System.out.println(big - (int)approx);
}
}

Сужающего:

package com.company;

public class Main {
public static void main(String[] args) {
float fmin = Float.NEGATIVE_INFINITY;
float fmax = Float.POSITIVE_INFINITY;
System.out.println("long: " (long)fmin
".." (long)fmax);
System.out.println("int: " (int)fmin
".." (int)fmax);
System.out.println("short: " (short)fmin
".." (short)fmax);
System.out.println("char: " (int)(char)fmin
".." (int)(char)fmax);
System.out.println("byte: " (byte)fmin
".." (byte)fmax);
}
}