Можно ли одновременно и обобщенно создавать подкласс как ограниченного универсального класса, так и универсального интерфейса? - PullRequest
4 голосов
/ 02 марта 2010

Я пытаюсь создать новый класс путем создания подкласса другого универсального класса (с границей) и реализации универсального интерфейса (без границы):

public class Foo1<T extends Bar> {
    ...
}

public interface Foo2<T> {
    ...
}

public class ProblemClass<T extends Bar, U> 
        extends Foo1<T extends Bar> implements Foo2<U> {
    ...
}

Это дает мне ошибки компиляции. Я также попробовал:

public class ProblemClass<T, U> 
        extends Foo1<T extends Bar> implements Foo2<U> {
    ...
}

public class ProblemClass<T extends Bar, U> 
        extends Foo1<T> implements Foo2<U> {
    ...
}

Но ни то, ни другое не работает.

Каков правильный синтаксис для определения моего подкласса таким образом, чтобы я мог сохранять типизацию общего типа, позволяя мне передавать их типы суперклассу и интерфейсу? Это вообще возможно?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 02 марта 2010

Эта декларация должна работать нормально. Какая у вас ошибка? Какой компилятор вы используете?

class ProblemClass<T extends Bar, U>
  extends Foo1<T>
  implements Foo2<U>
{
  ...
}

Это допустимая Java. Если компилятор IDEA отклоняет его, в IntelliJ есть ошибка.

1 голос
/ 02 марта 2010

Это не дает ошибок компиляции с JDK 1.6.0_07

public class Bar {}

public class Foo1<T extends Bar> {}

public interface Foo2<T> {}

public class ProblemClass<T extends Bar, U> extends Foo1<T> implements Foo2<U> {}
1 голос
/ 02 марта 2010

Из кода, который вы разместили, у вас есть только класс Foo, а не Foo1. Это причина? или просто сообщение об ошибке редактирования

Я думаю, что это должно работать

public class ProblemClass<T extends Bar, U> 
        extends Foo1<T> implements Foo2<U> {
    ...
}
0 голосов
/ 02 марта 2010

Это (из вашего вопроса):

public class ProblemClass<T extends Bar, U> 
        extends Foo1<T extends Bar> implements Foo2<U> {
    ...
}

должно быть так:

public class ProblemClass<T extends Bar, U> 
        extends Foo1<T> implements Foo2<U> {
    ...
}

То есть вы не должны пересчитывать границы при расширении Foo1.

С этим исправлением код прекрасно компилируется в javac. Если IntelliJ IDEA по-прежнему отказывается компилировать его, возможно, вы обнаружили ошибку, или, возможно, «Bar», на который вы ссылаетесь в Foo.java, не тот же «Bar» в ProblemClass.java?

...