binarySearch具有泛型并捕获

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了binarySearch具有泛型并捕获相关的知识,希望对你有一定的参考价值。

我有任务:

public interface Task 

然后我有了那些实现:

public interface Task__Init extends Task 
    void init(Element e);


public interface Task__Hit_Test extends Task 
    boolean hit_test(Element e, float x, float y);


public interface Task__Draw extends Task 
    void draw(Element e);

我还有一个可以容纳这些实现实例的类:

static public class Task_Holder<T extends Task> 
    public int task_id;
    public Task_Type type;
    public T task;
    // ...

然后我有一个包含这些的类,最后一个ArrayList包含所有这些(all_task_holders)

static public class Implementation_Context 
    public HashMap<String, ArrayList<Task_Holder<Task__Init>>>     init_solvers = new HashMap<>();
    public HashMap<String, ArrayList<Task_Holder<Task__Draw>>>     draw_solvers = new HashMap<>();
    public HashMap<String, ArrayList<Task_Holder<Task__Hit_Test>>> hit_test_solvers = new HashMap<>();

    public ArrayList<Task_Holder<? extends Task>> all_task_holders = new ArrayList<>();
    // ...

现在出现问题之一:

static public Task_Holder<?> find_task_holder(int task_id) 

    Comparator<Task_Holder<?>> comparator = (a, b)-> 
        if (a.task_id < b.task_id) return -1;
        if (a.task_id > b.task_id) return 1;
        return 0;
    ;

    Collections.sort(ctx.implementation.all_task_holders, comparator);

    Task_Holder<?> key = new Task_Holder<>();
    key.task_id = task_id;

    int index = Collections.binarySearch(ctx.implementation.all_task_holders, key);

    for (Task_Holder<?> th : ctx.implementation.all_task_holders) 
        if (th.task_id == task_id) 
            return th;
        
    
    assert false; // should we find things that are not there?
    return null;

对于binarySearch,我得到了(在此将其设为代码块,否则stackoverflow出于某些原因会删除单词?):

The method binarySearch(List<? extends Comparable<? super T>>,
T) in the type Collections is not applicable for the arguments
(ArrayList<sfjl_ui.Task_Holder<?>>, sfjl_ui.Task_Holder<capture#6-of
?>)

我不知道如何解决此问题。每次尝试都会破坏其他东西(例如,我破坏了高3行的排序)。感觉就像用其他信用卡还清信用卡债务一样,您永远赢不了。

我该如何解决?

答案

通过比较器as an additional argument

int index = Collections.binarySearch(ctx.all_task_holders, key, comparator);

以上是关于binarySearch具有泛型并捕获的主要内容,如果未能解决你的问题,请参考以下文章

唬人的Java泛型并不难

唬人的Java泛型并不难

关于java的binarySearch()方法

算法 -- C#实现二分查找(Binary Search)

Binary Search 专栏

Java入门——泛型