논리적 장치 타입 `LogicalDevice`가 있다.

`LogicalDevice`의 서브 타입으로 `CPU`와 `GPU`, `NPU`가 있다.

`PhysicalDevice`는 여러 종류, 여러 타입의 `LogicalDevice`를 가질 수 있다.

`PhysicalDevice`는 `LogicalDevice` 반환하는 메서드 `getLogicalDevices()`를 가진다.


`PhysicalDevice`를 구현 하는 타입은 `Mobile`, `PC`, `SuperComputer`가 있다.

`Mobile`는 `CPU`와 `NPU` 가지고 있고, `PC`는 `CPU`와 `GPU`를 하니씩 가지고 있고, `SuperComputer`는 `CPU`와 `GPU`를 여러개 가지고 있다.


각 `PhysicalDevice`의 구현은 `LogicalDevice`를 반환하는 메서드를 구현해야한다.

이 메서드는 컴파일 시점에 반환 할 수 있는 `LogicalDevice`의 서브 타입을 알 수 있어야 한다.


예를 들어, 다음과 같은 자바 코드는 반환할 수 있는 `LogicalDevice`의 타입을 알 수 없다.


```java

public class Mobile implements PhysicalDevice {

    @Override

    public List<LogicalDevice> getLogicalDevices() {

        return Arrays.asList(new CPU(), new NPU());

    }

}

```

자바는 안되지? selad permit interface랑 final class로 해보려고 하는데 잘안되네.