Java泛型,把T方法称为T而不是它的超类 [英] Java generics, call T method as T and not as its superclass

查看:280
本文介绍了Java泛型,把T方法称为T而不是它的超类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在java中我有以下伪代码:

  class MyClassSuper {
public static final String VALUE = E;
}

class MyClassSub扩展MyClassSuper {
public static final String VALUE =f;
}

class MyGenericClass< T extends MyClassSuper> {
public void print(){
System.out.println(T.VALUE);


$ / code>

当我使用MyClassSub创建MyGenericClass的新实例时它的类型我期望打印方法打印f,但它打印e。是否有可能让MyGenericClass把T当作它的实际类型,同时保持当前T扩展的超类?



编辑:



实际代码(缩写):

  public class Bean implements Serializable { 

public static final String FILE_EXT =;
private static final long serialVersionUID = 1L;



public class UserBean extends Bean {

public static final String FILE_EXT =u;
private static final long serialVersionUID = 1L;

私人字符串名称;

public UserBean(String name){
this.name = name;
}
}

public class BeanPersistence< T extends Bean>实现IBeanPersistence< T> {

public void printExtension(){
System.out.println(T.FILE_EXT);
}

}

这是我的代码试图写。基本上,我想让BeanPersistence类根据它初始化的Bean的类型知道它正在写入的文件使用什么扩展名。从我收集的意见来看,这是做这件事的错误方式,什么是适当的方式? (很明显,printExtension方法只是用于测试)

解决方案

根据您的情况,这可能是合适的。

  public class BeanPersistence< T extends Bean> {

public void printExtension(Bean bean){
System.out.println(bean.getExtension());


public static void main(String [] args){

BeanPersistence< Bean> persistence = new BeanPersistence<>();
UserBean userBean = new UserBean();
AdminBean adminBean = new AdminBean();
persistence.printExtension(userBean); //打印u
persistence.printExtension(adminBean); //打印
}
}

抽象类Bean {

abstract String getExtension();
}

类UserBean扩展Bean {

private static final String FILE_EXT =u;

@Override
String getExtension(){
return FILE_EXT;



类AdminBean扩展Bean {

private static final String FILE_EXT =a;

@Override
String getExtension(){
return FILE_EXT;




$ b一般而言,你应该通过访问对象属性,方法,而不是直接。当我们调用方法时,面向对象的行为(多态,动态调度)将调用正确的方法。



另见




I have the following pseudo-code in java:

class MyClassSuper{
    public static final String VALUE = "e";
}

class MyClassSub extends MyClassSuper{
    public static final String VALUE = "f";
}

class MyGenericClass<T extends MyClassSuper> {
    public void print(){
        System.out.println(T.VALUE);
    }
}

When I create a new instance of MyGenericClass with MyClassSub as its type I'm expecting the print method to print "f", but it prints "e" instead. Is it possible to have MyGenericClass treat T as the actual type that it is while keeping the super class that T extends currently ?

EDIT:

Actual code (abbreviated):

public class Bean implements Serializable {

    public static final String FILE_EXT = "";
    private static final long serialVersionUID = 1L;

}

public class UserBean extends Bean{

    public static final String FILE_EXT = "u";
    private static final long serialVersionUID = 1L;

    private String name;

    public UserBean(String name){
        this.name = name;
    }
}

public class BeanPersistence<T extends Bean> implements IBeanPersistence<T> {

    public void printExtension(){
        System.out.println(T.FILE_EXT);
    }

}

That is the code I'm trying to write. Basicly I want the BeanPersistence class to know what extension to use for the file it is writing, based on the type of Bean it was initialized with. From the comments I gather this is the wrong way of doing this, what would be the appropriate way ? (Obviously the printExtension method is just there to test)

解决方案

This might be suitable, depending on your case.

public class BeanPersistence<T extends Bean> {

    public void printExtension(Bean bean) {
        System.out.println(bean.getExtension());
    }

    public static void main(String[] args) {

        BeanPersistence<Bean> persistence = new BeanPersistence<>();
        UserBean userBean = new UserBean();
        AdminBean adminBean = new AdminBean();
        persistence.printExtension(userBean); // prints u
        persistence.printExtension(adminBean); // prints a
    }
}

abstract class Bean {

    abstract String getExtension();
}

class UserBean extends Bean {

    private static final String FILE_EXT = "u";

    @Override
    String getExtension() {
        return FILE_EXT;
    }
}

class AdminBean extends Bean {

    private static final String FILE_EXT = "a";

    @Override
    String getExtension() {
        return FILE_EXT;
    }
}

In general you should access object properties through methods, not directly. When we call methods, object-oriented behaviour (polymorphism, dynamic dispatch) will invoke the right method.

See also

这篇关于Java泛型,把T方法称为T而不是它的超类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆