java变量类型策略(隐藏、继承抽象泛型类、示例化泛型类)

cgyqldqp  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(418)

我无法在以下设计之间进行选择,因为我不知道它们在允许同一属性使用不同类型时的区别:
abstract class A {T:t} class BT1 extend A<T1> {} 这将继承抽象泛型类
abstract class A {G:t} class BT1 extend A {T1:t} 这将是变量隐藏 class A<T extend G> {T:t} 这个类将被示例化如下: new class A<T1> 这三种设计有什么不同?
jpa能为案例3检索具有特定类型变量的实体吗?
jpa如何处理泛型和继承的混合?

os8fio9y

os8fio9y1#

“这三种设计之间有什么区别?”
热释光;博士-
设计#1是“经得起未来考验的”;“开放扩建”
设计#2-正如您所写的-将无法编译,因为 BT1{T1:t} 不是一个 A {G:t} 设计#3共享#1的“优点”之一;它也是“未来的证明”#3的“缺点”是它是一个具体的类
这是基于我做的这个实验,让你的问题对我来说不那么抽象/更具体。
长话短说
这是一个这样的例子——当给出几种设计的选择时——选择“最佳设计”取决于你的选择是否正确地达到你想要的任何目的。
您的第二个问题(关于jpa)意味着您的意图可能是:“我想将我的应用程序的数据层与orm框架集成”。
“jpa是否可以为案例3检索具有特定类型变量的实体?”
我怀疑。如果你仔细想想,orm几乎不可能管理它。比方说,你注解了这样一个类,比如…

@Entity
@Table( name = "IMPOSSIBLES" )
public class A <T extends G > { 
    …
    @Column( name = "CHANGEABLE" )*/    
    private T t;
    …
    public T getT( ){ return t; }

    public void setT( T t ){ this.t = t; } 
    …
}

假设您的应用程序示例化了以下三种不同的参数化类型 A< T extends G > 就像… A< String > aStringNTT = new A< >( … ) A< Long > aLongNTT = new A< >( … ) A< Date > aDateNTT = new A< >( … )
然后您(或jpa/hibernate)必须编写的ddl才能将上述内容持久化到 IMPOSSIBLES table应该是…

CREATE TABLE IMPOSSIBLES … ( CHANGEABLE VARCHAR(255) OR NUMBER OR DATE OR … , … )

不存在这样的语法来定义具有动态变化的数据类型的数据库表列。无论如何,在我所知道的任何sql实现中都没有。
“jpa如何处理泛型和继承的混合?”
以我的经验,这种混合处理得很好。我几个月前就实现了…

import javax.persistence.*;    
import org.springframework.data.domain.Persistable;

@MappedSuperclass
public abstract class AbstractPersistableCustom<PK extends Serializable> implements Persistable<Long> {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;

        /*
         * (non-Javadoc)
         * 
         * @see org.springframework.data.domain.Persistable#getId()
         */
        @Override
        public Long getId() {
            return id;
        }

        protected void setId(final Long id) {
            this.id = id;
        }
        …
}

…jpa处理了这个和其他几个混凝土 @Entity s成功…

@Entity
@Table(name = "survey_says")
public class Question extends AbstractPersistableCustom<Long> {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "survey_id")
    private Survey survey;

    @OneToMany(mappedBy = "question", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @OrderBy("sequenceNo")
    private List<Response> responses;    
    …
}

相关问题