2011-01-29 6 views
2

Я использую такие дженерики: public class MyList<T>. Есть ли способ гарантировать, что класс, представленный T, реализует определенный статический метод?Java generics - обеспечивает статический метод.

+0

@Kirk Woll: Я стараюсь избегать использования подкласса или необходимости объявлять нестатические методы, которые действительно должны быть статическими. В то же время я хочу, чтобы мой код был как можно более кратким с использованием дженериков. – ryyst

+0

@user, я хочу сказать, что даже если бы вы * могли добавить такое ограничение, это было бы бессмысленно, поскольку вы ничего не могли бы сделать с этой способностью из вашего общего «MyList ». Вы не сможете вызывать эти статические методы из своего общего списка - вы не можете ничего делать со статическими членами через общие параметры. –

+0

ИМХО, ваш метод не должен быть статичным. Даже если вам нужен метод, возвращающий одно и то же значение для каждого экземпляра и не использующий 'this' вообще, он не должен быть статическим (что потребовалось мне однажды, чтобы понять). Фактически для статических методов существует всего лишь несколько применений. – maaartinus

ответ

2

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

Вы можете, однако, создать общий статический метод.

public static <T> List<T> makeSingletonList(T item) { 
     ArrayList<T> result = new ArrayList<T>(); 
     result.add(item); 
     return result; 
} 
+0

okay, meh ...... – ryyst

+1

И поместите его в абстрактный класс, который ваши классы должны расширить. – BalusC

2

К сожалению, нет.

В качестве альтернативы, рассмотрим, принадлежит ли статические методы вашего класса в какой-то связанного класса, как строитель:

class Person { 
    public static Person createFromDatastore(Datastore datastore) { ... } 
} 

Это может быть лучше, чтобы переместить статический в отдельный класс, как не- статический метод:

class PersonBuilder implements Builder<Person> { 
    public Person createFromDatastore(Datastore datastore) { ... } 
} 

Это означает, что вы можете диктовать клиентам вашего общего класса теперь могут быть необходимы для обеспечения его:

public class MyList<B extends Builder<T>, T> ... 
+0

+1: Хотя, я не думаю, что это несчастливо ;-) – Jeremy

+0

@Jeremy Heller - lol - и спасибо за редактирование. –

Смежные вопросы