有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中创建泛型方法

如果我将(Inventory)更改为(T),它将无法识别getId()

    public static <T> T getSelectedRow(Table table) {
        T selectedItems = (T) table.getValue();
        if (selectedItems != null) {
            System.out.println("getSelectedRow id:"+ ((Inventory) selectedItems).getId());
            return selectedItems;
        }

我如何使它作为((T) selectedItems).getId()工作 表是vaadin7,我使用Java8

我不想使用Inventory,它应该是泛型的,这样我就可以使用不同的对象Inventory只是其中之一,有些人有{}有些人没有


共 (2) 个答案

  1. # 1 楼答案

    因为T是类型的占位符,而且就编译器而言T没有getId()或任何其他不属于Object的方法。你不能那样做

    但是,您可以将T约束为<T extends Inventory>

  2. # 2 楼答案

    如果您确实需要getId

    public interface HasId {
        long getId();
    }
    
    public class Inventory implements HasId {
    
        @Override
        public long getId() { return id; }
    }
    
    public static <T extends HasId> T getSelectedRow(Table table) {
        T selectedItems = (T) table.getValue();
        if (selectedItems != null) {
            System.out.println("getSelectedRow id:"+ selectedItems.getId());
            return selectedItems;
        }
    ...
    

    或者(没有接口)更难看、更脆弱——当只需要getId时:

    public static <T> T getSelectedRow(Table table, ToLongFunction<T> idGetter) {
        T selectedItems = (T) table.getValue();
        if (selectedItems != null) {
            System.out.println("getSelectedRow id:"+ idGettter.apply(selectedItems));
            return selectedItems;
        }
    ...
    
    Inventory inventory = getSelectedRow(table, Inventory::getId);