Различают foo (int) и foo (Integer) в Java - PullRequest
0 голосов
/ 25 февраля 2019

Я не смог найти это, хотя в настоящее время у меня есть сценарий использования, где у меня есть универсальный тип, который имеет метод foo(int) и метод foo(T).Для моего варианта использования указанный тип создается с помощью T = Integer, что означает, что у меня есть методы foo(int) и foo(Integer).Всякий раз, когда я пытаюсь вызвать foo(Integer), вместо этого он вызывает foo(int), независимо от того, указан ли тип, независимо от того, произнесу я или нет.Единственное, что его решает, - это использование Long, чего я не хочу делать.

Есть ли способ заставить java использовать метод foo(Integer)?

Edit:

На этот раз, чтобы ответить на комментарий, я не думаю, что здесь уместен код, поскольку то, что я описал, было достаточно формализуемым, чтобы понять, что я имел в виду.Во-вторых, ошибка была на моем конце, прошу прощения.У меня не было ожидаемого поведения, и я подумал, что это произойдет из-за проблемы в этом отношении, тем более что в моей IDE отображалось использование метода foo(int).Я закрою это сейчас

MVCE:

Main.java

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(Main,args);
    }
}

Controller.java

package sample;

import javafx.collections.FXCollections;
import javafx.fxml.Initializable;
import javafx.scene.control.ListView;


public class Controller implements Initializable {

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        ListView<Integer> listView = new ListView<>();
        listView.setItems(FXCollections.observableArrayList(1, 5, 8, 13));
        Integer t = 5;
        listView.getSelectionModel().select(t);
        System.out.println(listView.getSelectionModel().getSelectedItems());
    }
}

sample.fxml

<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<GridPane fx:controller="sample.Controller"
          xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
</GridPane>

Вы заметите, что этот код работает, как и ожидалось, но теперь я понял, что я использую не Java, а скорее Groovy - переключение окончаний файлов на Groovy и компиляция с помощью Groovy компилятораэта программа имеет мое описанное поведение, что означает, что проблема связана с govy, а не с java.

1 Ответ

0 голосов
/ 25 февраля 2019

Ваш вопрос, как указано, имеет простой ответ:

class Foo<T> {
    void foo(int i) {
        System.out.println("foo(int)");
    }
    void foo(T t) {
        System.out.println("foo(T)");
    }
}

private void test() {
    Foo<Integer> foo = new Foo<>();
    foo.foo(1);
    foo.foo((Integer)1);
    foo.foo(Integer.valueOf("1"));
}

отпечатки:

foo (int)

foo (T)

foo (T)

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

Если хотите, ознакомьтесь с правилами выбора метода здесь: https://docs.oracle.com/javase/specs/jls/se11/html/jls-5.html#jls-5.3.

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