вызов нестатического метода в статическом методе в Java [дубликат]

Этот вопрос уже имеет ответ здесь:

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

Не может сделать статическую ссылку на нестатический метод methodName () от воспроизведения типа

Я не могу сделать метод статичным, поскольку это дает мне ошибку также.

Этот статический метод не может скрыть метод экземпляра от xInterface

Там какой-либо путь состоит в том, чтобы обойти вызов нестатического метода в другом статическом методе? (Эти два метода находятся в отдельных пакетах и отдельных классах).

118
задан Oded 21 December 2011 в 09:55
поделиться

6 ответов

Если вы должны поддерживать произвольные предикаты, вы можете извлечь из этого (который основан на IDEA Daniel ):

List(v1, v2) filter (_ %2 == 0) match {
    case List(value1, value2) => "a"
    case List(value) => "b"
    case _ => "c"
}

Определение функции:

def filteredMatch[T,R](values : T*)(f : T => Boolean)(p: PartialFunction[List[T], R]) : R = 
    p(List((values filter f) :_* ))

Теперь вы можете использовать его так:

filteredMatch(v1,v2)(_ %2 == 0){
    case List(value1, value2) => "a"
    case List(value) => "b"
    case _ => "c"
}

Я не так уверен, если это хорошая идея (то есть читаемая). Но аккуратные упражнения тем не менее.

Было бы здорово, если бы вы могли совпадать на кортежи: Case (значение1, значение2) => ... вместо списков.

-121--3039960-

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

132
ответ дан 24 November 2019 в 01:55
поделиться

Вам нужен экземпляр класса, содержащий нестатический метод.

Похоже, когда вы пытаетесь вызвать нестатический метод StartSwith класса string без экземпляра:

 String.startsWith("Hello");

Что вам нужно, это иметь экземпляр, а затем вызвать Нестатический метод:

 String greeting = new String("Hello World");
 greeting.startsWith("Hello"); // returns true 

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

5
ответ дан 24 November 2019 в 01:55
поделиться

EF не может составить запрос из выражения LINQ, включающего метод. Для создания SQL EF требуются литеральные значения.

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

-121--3643204-

Можно создать экземпляр класса, в котором требуется вызвать метод, например

new Foo().nonStaticMethod();
-121--691431-

Существует два способа:

  1. Вызовите нестатический метод из экземпляра в статическом методе. Смотрите ответ Фабьена для образца в один конец... хотя я настоятельно рекомендую не делать этого. Своим примером он создает экземпляр класса и использует его только для одного метода, только для того, чтобы утилизировать его позже. Я не рекомендую его, потому что он рассматривает экземпляр как статическую функцию.
  2. Измените статический метод на нестатический.
1
ответ дан 24 November 2019 в 01:55
поделиться

Вы можете создать экземпляр класса, который вы хотите вызвать метод включен, например.

new Foo().nonStaticMethod();
89
ответ дан 24 November 2019 в 01:55
поделиться

Вы не можете получить это ограничение напрямую, нет. Но могут быть некоторые разумные вещи, которые вы можете сделать в вашем конкретном случае.

Например, вы можете просто «новый» экземпляр вашего класса в статическом методе, затем вызовите нестатический метод.

Но вы можете получить еще лучшие предложения, если вы публикуете свой класс (ES) - или сбивную версию их.

1
ответ дан 24 November 2019 в 01:55
поделиться

Canvas имеет два типа изменения изменения размера:

  • изменение размера, где Содержимое растягивается, чтобы соответствовать новым размерам холста
  • , изменяющих изменение размера, где содержимое остается статическим, а холст растет или сжимается

Вот страница, которая демонстрирует два типа «размера»: http: // xavi. CO / Static / SO-RESIZABLE-CONVAS.HTML

Если вы хотите, чтобы первый тип размера (растянуть содержимое), поместите холст в контейнер DIV и установите ширину и высота холста до 100% с использованием CSS. Вот что может выглядеть этот код:

/* The CSS */
#stretch {
    height: 100px;
    width: 200px;
}

#stretch canvas {
    width: 100%;
    height: 100%;
}

<!-- The markup -->
<div id="stretch"><canvas></canvas></div>

// The JavaScript
$("#stretch").resizable();

Вторым типом размера (статическое содержимое) является двухэтапным процессом. Сначала вы должны настроить ширину и высота атрибуты элемента Canvas. К сожалению, это очищает холст, поэтому вы должны затем повторно привлечь все его содержание. Вот кусочек кода, который делает это:

/* The CSS */
#resize {
    height: 100px;
    width: 200px;
}

<!-- The markup -->
<div id="resize"><canvas></canvas></div>

// The JavaScript
$("#resize").resizable({ stop: function(event, ui) {
    $("canvas", this).each(function() { 
        $(this).attr({ width: ui.size.width, height: ui.size.height });

        // Adjusting the width or height attribute clears the canvas of
        // its contents, so you are forced to redraw.
        reDraw(this);
    });
} });

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

-121--1578441-

Это звучит как метод действительно должен быть статичным (то есть. Он не доступа к любым элементам данных, и ему не нужен экземпляр). Поскольку вы использовали термин «статический класс», я понимаю, что весь класс, вероятно, посвящен утилитам методам, которые могут быть статичными.

Тем не менее, Java не позволяет внедрению интерфейсного метода быть статическим. Поэтому, когда вы (естественно) пытаетесь сделать статический метод, вы получите ошибку «Невозможно скрыть-экземпляр-метод». (Спецификация языка Java упоминает это в разделе : : Обратите внимание, что метод, объявленный в интерфейсе, не должен быть объявлен статическим, или ошибка времени компиляции происходит, поскольку статические методы не могут быть абстрактными. «)

Так что до тех пор, пока способ присутствует в Xinterface , и ваш класс применяется XinterFace , вы не сможете сделать метод статическим.

Если вы не можете изменить интерфейс (или не хотите), есть несколько вещей, которые вы можете сделать:

  • Сделайте класс Singleton: сделайте конструктор частным и иметь статический элемент данных в класс, чтобы удерживать единственный существующий экземпляр. Таким образом, вы будете вызывать метод на экземпляре, но, по крайней мере, вы не будете создавать новые экземпляры каждый раз, когда вам нужно позвонить в метод.
  • Реализация 2 метода в вашем классе: метод экземпляра (как определено в XinterFace ), а также статический метод. Метод экземпляра будет состоять из одной строки, которую делегаты к статическому методу.
6
ответ дан 24 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: