簡體   English   中英

在不使封閉類通用的情況下縮小Java字段類型?

[英]Narrow a Java field type without making the enclosing class generic?

是否可以縮小Java類中字段的類型而無需使包含類本身成為通用類型?

通用示例如下所示:

abstract class MyClass {
    //...
}

interface MyInterface {
    //...
}

class MyConcreteClass<T extends MyClass & MyInterface> {
    private T value;
}

有什么辦法可以做到以下幾點:

class MyConcreteClass {
    private MyClass & MyInterface value;
}

這本質上等效於MyConcreteClass或原始MyConcreteClass類型。 在我的實現中,類型參數將在對象的整個生命周期內變化(固化的可變性!它由JPA強加給我!),因此類型注釋似乎有些多余。

  • 編輯-

我還沒有提到其他限制。 我們還將有:

class SubA extends MyClass
class SubB extends MyClass
class SubC extends MyClass

class SubSubA extends SubA implements MyInterface
class SubSubB extends SubB implements MyInterface
class SubSubC extends SubC implements MyInterface

因此,僅聲明實現MyInterface的MyClass的抽象子類是不合適的解決方案。

而且,最終字段類型必須是具體類型,而不是簡單的表示相交的接口,原因很簡單,JPA持久實體無法通過其接口類型進行引用。 也就是說,JPA實體類中的持久字段必須是原始類型或具體實體類型。

我從來沒有遇到過這樣的問題(因此,沒有一個優雅的解決方案出現:-)……但是……

interface Fooable 
{
}

abstract class MyClass 
    implements Fooable 
{
}

interface MyInterface 
    extends Fooable 
{
}

class MyConcreteClass 
{
    private Fooable value;
}

在這種復雜的情況下,您應該將類​​隱藏在接口后面。

然后,您可以為相交定義一個顯式接口,即擴展與MyClass和MyInterface相對應的接口的接口,並讓適當的超類代替MyInterface來實現它。

我認為沒有辦法做到這一點。 反正也不是那樣。 但是,由於這是一個私有字段,您可以完全控制它,因此可以將其聲明為

 private MyClass value;

而且還要確保在您的所有代碼中,只有實現MyInterface的對象會受到影響,並且將您需要訪問的所有對象都強制轉換為接口。 是的,它看起來很臟,而且(有點)。

您還可以創建以下派生類

abstract class MyDerivedClass extends MyClass implements MyInterface {
    //...
}

然后使用

 private MyDerivedClass value;

這要干凈得多,但您必須為此創建另一個類...

暫無
暫無

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

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