Создание экземпляра универсального класса, реализующего универсальный интерфейс

#java #android

#java #Android

Вопрос:

Я столкнулся с рядом проблем при создании экземпляра универсального класса, реализующего универсальный интерфейс: у меня есть универсальный интерфейс IA

 interface IA<MyClass, String>
  

У меня есть универсальный класс, который реализует этот интерфейс

 class ClassA implements IA<MyClass, String> {
    // constructor
    public ClassA(boolean someParam){
    }
    String func(){
        return "abc"; 
    }
}
  

Первая проблема, с которой я сталкиваюсь, это когда я создаю экземпляр объекта ClassA

 IA<MyClass,String> objectA = new ClassA(false);
  

Я получил предупреждение о том, что используйте <> для универсального типа. Итак, я добавил, что

 IA<MyClass,String> objectA = new ClassA<>(false);
  

Затем я получил ошибку компиляции: не удается вывести аргументы типа для ClassA.
После нескольких поисковых запросов в Интернете я обнаружил, что мне может потребоваться указать аргумент типа в определении, поэтому я меняю определение класса на

 class ClassA<MyClass, String> implements IA<MyClass, String> {
    // constructor
    public ClassA(boolean someParam){
    }
    String func(){
        return "abc"; 
    }
}
  

Теперь я исправил это, но получил другую ошибку в func (), в которой говорится: «требуется строка, найдено java.lang.Строка».

В одном из сообщений предполагалось, что компилятор перепутал любую «строку» в классе со строкой аргумента универсального типа и должен удалить ее из аргумента типа. Итак, я изменил на следующее:

 class ClassA<MyClass> implements IA<MyClass, String> {
    // constructor
    public ClassA(boolean someParam){
    }
    String func(){
        return "abc"; 
    }
    void func2(){
        MyClassObj.someFunctionCall();//MyClassObj is an instance of MyClasss
    }
}
  

Затем вышеуказанное изменение прерывает MyClassObj.someFunctionCall(). Компилятор сообщает, что someFunctionCall() не распознан.

Большая часть кода уже существует в codebase, и я просто модифицирую некоторую логику. Связаны ли эти проблемы с чем-то новым в Java 8? Я был бы признателен, если бы кто-нибудь пролил некоторый свет на эти серии проблем и порекомендовал наилучшую практику.

Комментарии:

1. При размещении обобщений рядом с объявлением класса объявляются подстановочные знаки. Интерфейс должен быть чем-то вроде interface IA<A,B> . Ваш ClassA должен реализовать интерфейс с конкретными типами для подстановочных знаков и не должен иметь никаких собственных обобщений. class ClassA implements IA<MyClass, String>

2. @4castle: Верно, я пропустил ввод интерфейса в сообщении. Итак, интерфейс определен как интерфейс IA<A, B>, а мой класс определен как класс ClassA, реализующий IA<MyClass, String> . Возникла проблема с подобными классами и интерфейсами.

3. Просто хочу уточнить, что проблемы, которые я опубликовал, возникают, когда класс определяется как интерфейс IA<A, B>, а класс ClassA реализует IA<MyClass, String> . Есть предложения по вышеуказанному вопросу?

4. Да: 1-Добавьте параметры шаблона только для универсальных интерфейсов. В вашем случае: interface IA<A,B>{...} . 2-Заменяйте параметры шаблона для конкретного класса только при обращении к универсальным классам. В вашем случае: classA implements IA<MyClass, String>{...} . И затем IA<MyClass, String> objectA=new ClassA(false) .