Причина, почему у Вас не может быть статического метода в интерфейсе, заключается в том, как статические ссылки твердости Java. Java не потрудится искать экземпляр класса при попытке выполнить статический метод. Это вызвано тем, что статические методы не являются зависимым экземпляра и следовательно могут быть выполнены прямо из файла класса. Учитывая, что все методы в интерфейсе абстрактны, VM должен был бы искать конкретную реализацию интерфейса для нахождения кода позади статического метода так, чтобы это могло быть выполнено. Это тогда противоречит, как разрешение статического метода работает и ввело бы несоответствие в язык.
В Java есть примитивные типы, объекты и массивы и все. Нет typedefs.
Если это то, что вы имеете в виду, вы можете просто расширить класс, который вы хотите для typedef, например:
public class MyMap extends HashMap<String, String> {}
В java с версии 1.6 нет typedef, вы можете создать класс-оболочку для того, что вам нужно, поскольку вы не можете создавать подклассы конечных классов (Integer, Double и т. Д.)
Вы можете использовать Enum, хотя семантически он немного отличается от typedef, поскольку допускает только ограниченный набор значений. Другое возможное решение - именованный класс-оболочка, например
public class Apple {
public Apple(Integer i){this.i=i; }
}
, но он кажется более неуклюжим, особенно учитывая, что из кода не ясно, что у класса нет другой функции, кроме как псевдоним.
Typedef позволяет неявно присваивать элементам типы, которыми они не являются. Некоторые люди пытаются обойти это с помощью расширений; прочтите здесь, в IBM, чтобы объяснить, почему это плохая идея.
Edit: Хотя строгий вывод типов полезен, я не думаю (и надеюсь, что мы не увидим) typedef
Уродливая голова в управляемых языках (когда-либо?).
Редактировать 2: В C # вы можете использовать оператор using, подобный этому, в верхней части исходного файла. Он используется, поэтому вам не нужно выполнять второй показанный пункт. Единственный раз, когда вы видите изменение имени, - это когда в области видимости возникает конфликт имен между двумя типами. Переименование ограничено одним файлом, за пределами которого каждый тип переменной / параметра, который его использовал, известен своим полным именем.
using Path = System.IO.Path;
using System.IO;
В Java нет необходимости в typedef. Все является объектом, кроме примитивов. Указателей нет, только ссылки. Сценарии, в которых вы обычно используете typedef, - это экземпляры, в которых вы вместо этого создаете объекты.