Создать метод java, который принимает только не абстрактные типы классов - PullRequest
2 голосов
/ 27 мая 2020

В Java, возможно ли создать метод / подпись, которая принимает все неабстрактные типы классов?

Что-то вроде этого:

public Object getInstance(Class<? extends ConcreteClassSuperType> someNonAbstractClass){
  //some logic that can safely assume that the Class object is not an interface type nor an abstract class
}

, где ConcreteClassSuperType - это просто вымышленный тип, созданный для иллюстрации моих намерений. Использование ? extends Object здесь не решает проблему.

Доработка: В данном случае проблема была немного более конкретной c в том, что моя подпись не должна принимать ВСЕ конкретные классы, но только те, которые реализуют некоторый интерфейс, т.е. я пытался создать подпись, которая принимает тип Class для класса, который implements MyInterface. Таким образом, можно передать fx MyClass.class, где MyClass implements MyInterface. Возникли две проблемы:

  1. Подпись также будет принимать MyInterface.class (поскольку обобщенные типы Class<? extends MyInterface> не являются строгой верхней границей)
  2. Можно передать тип класса другого интерфейса это extends MyInterface.

1 Ответ

0 голосов
/ 10 июня 2020

Поскольку классы могут иметь несколько параметров, я думаю, что проще сначала просто проверить, является ли класс конкретным, а затем реализовать средства для его создания. Например,

public <T> boolean isConcrete(Class<T> c) {

    if (c.isInterface() || (c.getModifiers() & Modifier.ABSTRACT) == Modifier.ABSTRACT)
        return false;

    return true;
}

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ

Извините, только что заметил в другом комментарии, вы можете упростить это ...

public <T> boolean isConcrete(Class<T> c) {

    if (c.isInterface() || Modifier.isAbstract(c.getModifiers()))
            return false;

    return true;
}
...