簡體   English   中英

限制擴展java中的泛型,以任何方式繞過它?

[英]Limitation extending generics in java, any way to get around it?

我有以下模型在我的應用程序中制作控制器。 顯然,完整的模型更復雜,但我會專注於導致我出現問題的唯一部分:

public abstract AbstractController<T> {
    abstract protected Class<T> getType();
}

public ParentController extends AbstractController<Parent> {
    @Override
    protected Class<Parent> getType() {
        return Parent.class;
    }
}

現在我想擴展Parent對象並為子有一個控制器,它看起來像這樣:

public SonController extends ParentController {
    @Override
    protected Class<Son> getType() {
        return Son.class;
    }
}

問題是getType()方法在編譯時顯示不兼容(期望類Parent)。

我嘗試使用泛型,但我找不到解決方案。 方法getType在抽象控制器的幾個方法中使用,我真的想避免覆蓋那些。

任何想法都會很好。

你可以改變getType返回Class<? extends T> Class<? extends T>

abstract protected Class<? extends T> getType();

然后ParentControllerSonController看起來像

public class ParentController extends AbstractController<Parent> {
    @Override
    protected Class<? extends Parent> getType() {
        return Parent.class;
    }
}

public class SonController extends ParentController {
    @Override
    protected Class<? extends Parent> getType() {
        return Son.class;
    }
}

泛型是開始時不變的,因此Class<Son>不能分配給Class<Parent> (在您的情況下,這些不是協變返回類型)。

但是帶有擴展邊界(上限)的通配符使得類型協變 ,因此這將解決它:

public abstract class AbstractController<T> {
    abstract protected Class<? extends T> getType();
}

public class ParentController extends AbstractController<Parent> {
    @Override
    protected Class<? extends Parent> getType() {
        return Parent.class;
    }
}

class SonController extends ParentController {
    @Override
    protected Class<? extends Parent> getType() {
        return Son.class;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM