Можно ли наложить верхнюю границу (супер-X) на именованный общий тип? - PullRequest
9 голосов
/ 04 июня 2011

Предположим, у меня есть следующий статический метод и интерфейс (список - java.util.List). Обратите внимание, что статический метод применяет «super Foo» к типу подстановочных знаков в списке.

public class StaticMethod {
   public static void doSomething(List<? super Foo> fooList) {
      ...
   }
}

public interface MyInterface<T> {
   public void aMethod(List<T> aList);
}

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

public class MyClass<T> implements MyInterface<T> {
   public void aMethod(List<T> aList) {
     StaticMethod.doSomething(aList);
   }
}

Это, очевидно, не скомпилируется, потому что T не имеет ограничения "super Foo". Тем не менее, я не вижу способа добавить ограничение «супер Foo». Например - следующее не разрешено:

public class MyClass<T super Foo> implements MyInterface<T> {
   public void aMethod(List<T> aList) {
     StaticMethod.doSomething(aList);
   }
}

Есть ли способ решить эту проблему - в идеале без изменения StaticMethod или MyInterface?

Ответы [ 2 ]

1 голос
/ 04 июня 2011

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

Вот пример использования, который компилируется, но обратите внимание, что мне нужно назвать реальный класс, который является супер-частью Foo:

class SomeOtherClass
{
}

class Foo extends SomeOtherClass
{
}

class StaticMethod
{
    public static <T> void doSomething(List<? super Foo> fooList)
    {
    }
}

interface MyInterface<T>
{
    public void aMethod(List<T> aList);
}

class MySpecificClass implements MyInterface<SomeOtherClass>
{
    public void aMethod(List<SomeOtherClass> aList)
    {
        StaticMethod.doSomething(aList);
    }
}

Комментарии

p.s. Мне нравится вопрос:)

0 голосов
/ 04 июня 2011

Если вы уверены, что aList содержит объекты, которые можно безопасно преобразовать в <? super Foo>, то вы можете сделать:

public static class MyClass<T> implements MyInterface<T> {
    @Override
    public void aMethod(List<T> aList) {
        StaticMethod.doSomething((List<? super Foo>) aList);
    }
}

См. Полный и рабочий пример: http://ideone.com/fvm67

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