Это может быть слишком поздно, но если вы добавите рабочий стол
. Columns.AutoFit ();
или
рабочий лист.Rows.AutoFit ();
он также работает.
Вызов статических методов в Java требует указания точного типа.
Обратите внимание, что этот подход не универсален для всех языков: например, вы можете переопределить методы класса в Objective-C, а какао-каркасы Apple хорошо используют этот механизм для настройки своих «фабричных» классов. Однако методы Java, C ++ и C # не поддерживают полиморфное поведение.
Теоретически разработчики Java могли позволить вам реализовать реализации метода интерфейса с помощью методов static
в случае, если реализация не нуждается в доступе состояние из экземпляра. Но такое же поведение легко достичь с помощью тривиальной оболочки:
public class MyImplementation implements MyInterface {
public MyImplementation(String name) {
}
@Override
public MyInterface getInstance() { // static is not allowed here
return getInstanceImpl();
}
public static getInstanceImpl() {
return new MyImplementation(name)
}
}
Компилятор Java мог бы сделать то же самое от вашего имени, но, увидев, что статический метод реализует метод экземпляра, является необычным и запутанным, поэтому я предполагаю, что разработчики Java решили отказаться от предоставления этого «волшебства».
, потому что реализация интерфейса делает конструктором тип интерфейса. Это означает, что экземпляры должны иметь методы, определенные типом, а не классом экземпляров.
Другими словами,
public void mymethod
и
public static void mymethod
НЕ являются тем же самым объявлением метода. Они совершенно разные. Если mymethod
определен на интерфейсе, то второе определение просто не удовлетворяет реализации интерфейса.
Ответ сводится к тому, что означает реализовать интерфейс. Когда класс реализует интерфейс, это означает, что каждый экземпляр класса будет отвечать на каждый метод интерфейса. Когда вы реализуете метод как статический, вы можете вызвать метод без экземпляра класса, но это не соответствует обещанию реализации наследования, что метод будет доступен для каждого экземпляра класс.
Статические методы не могут подвергаться полиморфному поведению. Это не имеет большого смысла. Создайте этот вариант использования, предположив, что вы хотите:
public void foo(MyInterface i) {
i.getInstance("abc");
}
теперь я хочу вызвать этот метод с реализацией MyInterface
(класс A
), но поскольку я не могу передать класс, мне нужно передать объект:
A a = new A();
foo(a);
теперь внутри foo
переопределение static
getInstance
вызывается в экземпляре класса A
. Итак, теперь я застрял в создании объекта, чтобы вызвать статический метод.
Я хочу сказать, что вы все равно должны были бы создать объект в большинстве случаев полиморфизма, поскольку в вашем исходном интерфейсе метод был метод экземпляра.