Параметр типа T находится за его пределами;должен расширять MyBaseClass - PullRequest
0 голосов
/ 01 июня 2018

Я имею дело с устаревшим кодом, пытаюсь реорганизовать и извлечь общий код.Я закончил со следующей иерархией.

public interface MyInterface<T extends MyBaseClass> {...}
public class MyBaseClass {...}
public class MyClass extends MyBaseClass implements MyOtherInterface<MyClass> {...}

public interface MyOtherInterface<T extends MyOtherInterface<T>> {
    void func(MyInterface<T> context);  // Complains that T should extend MyBaseClass
}

Словом, я хочу указать, что параметр T, передаваемый в MyOtherInterface, должен быть классом, который расширяет MyBaseClass и реализует MyOtherInterface.Примерно так:

public interface MyOtherInterface<T extends MyOtherInterface<T extends MyBaseClass>>

Как мне это сделать?Я пытаюсь изменить как можно меньше.Я не уверен, что вышеупомянутое возможно, и мне, возможно, придется фактически перевернуть иерархию.

1 Ответ

0 голосов
/ 18 июня 2018

Из руководства Oracle по Java:

Multiple Bounds

The preceding example illustrates the use of a type parameter with a single bound, but a type parameter can have multiple bounds:

<T extends B1 & B2 & B3> A type variable with multiple bounds is a subtype of all the types listed in the bound. If one of the bounds is a class, it must be specified first. For example:

Class A { /* ... */ } interface B { /* ... */ } interface C { /* ...
*/ }

class D <T extends A & B & C> { /* ... */ } If bound A is not specified first, you get a compile-time error:

class D <T extends B & A & C> { /* ... */ }  // compile-time error

Источник: https://docs.oracle.com/javase/tutorial/java/generics/bounded.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...