#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)
.