Как обеспечить неизменность параметров типа

class Pair<A,B> {
    final A first;
    final B sec;

    Pair(A f, B s){
        this.first = f;
        this.sec = s;
    }
}

Есть ли способ гарантировать, что A и B являются неизменяемыми типами?

Ответ 1

Нет. Невозможно идентифицировать, не говоря уже о привязке, к типу как неизменяемому.

Вы можете создать интерфейс маркера (один без методов, например Serializable), который используется в вашем проекте для определения неизменяемых классов, и ваша команда придерживается его.

Например:

interface Immutable {}

class Pair<A extends Immutable, B extends Immutable> {
}

Ответ 2

Нет. На самом деле в языке вообще нет понятия или "изменчивых" или "неизменных" типов. "Неизменяемый" - это просто термин, который мы используем для описания типа, который не предлагает никаких методов или публичных полей, которые позволят вам изменить любое внутреннее состояние. Помимо этого, нет никакой разницы между тем, как работают "изменяемые" и "неизменные" типы.