相关疑难解决方法(0)

迁移java类以使用泛型

我有一个问题是在我的班级中使用泛型.这些是我的课程:

public interface InterE<PK> {}

public interface Inter2<O extends ClassO, P extends ClassP> {}

public class ClassU<O extends ClassO, P extends ClassP> implements InterE<Long> {}

public class ClassP {}

public class ClassO {}

public class Class1<PK, T extends InterE<PK>> {
    public Class1 (Class<T> clazz) {}
}

public class Class2<O extends ClassO, P extends ClassP> extends Class1<Long, ClassU<O, P>> implements Inter2<O, P> {
    public Class2 () {
        //old constructor
        //super(ClassU.class);
        //new - here is problem
        super(ClassU<O, P>.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果ClassU不使用泛型,那么Class2中的旧构造函数工作正常,但我需要在ClassU中使用泛型,所以我在Class2中调用超级构造函数时遇到问题.

java generics

6
推荐指数
1
解决办法
214
查看次数

如何确定实现具有lambda的通用FunctionalInterface的Bean的类型参数?

我有一个通用的功能界面:

@FunctionalInterface
public interface Feeder<T extends Animal> {
  void feed(T t);
}
Run Code Online (Sandbox Code Playgroud)

还有一些bean为不同的Animal子类实现了这个接口.

@Configuration
public class Config {
  @Bean
  public Feeder<Dog> dogFeeder() {
    return dog -> dogService.feedDog(dog);
  }
  @Bean
  public Feeder<Cat> catFeeder() {
    return cat -> catService.feedCat(cat);
  }
}
Run Code Online (Sandbox Code Playgroud)

现在已经为这些bean注入了一个服务类,并给出了一个实例Animal.如何确定使用正确的Feeder bean?

@Service
public class PetStore {
  @Autowired
  private List<Feeder<? extends Animal> feeders;

  private void feed(Animal animal) {
    //TODO: How to determine the correct feeder from feeders?
    Feeder<? extends Animal> correctFeeder = ....
    correctFeeder.feed(animal);
  }
}
Run Code Online (Sandbox Code Playgroud)

我试过的事情:

我最初认为我可以使用如何获取泛型类型T的类实例, …

java reflection lambda spring

6
推荐指数
1
解决办法
535
查看次数

泛型类中的 T.class 相当于什么?

考虑以下通用转换器类(为简洁起见,已简化/不完整)...

public abstract class BaseConverter <TModel>
{
    public void convert(String data, Class<TModel> classOfModelType)
    {
    }

    public void convert(String data)
    {
        convert(data, TModel.class); // This doesn't work!
    }
}
Run Code Online (Sandbox Code Playgroud)

在子类外部,我可以convert毫无问题地调用第一个。将此子类视为Car泛型类型参数。我可以进去Car.class,像这样...

public class CarConverter extends BaseConverter<Car>
{
    public void someFunction()
    {
        String someString;
        convert(someString, Car.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想做的就是尽可能多地移动到基类。由于 'Car' 在这里是已知的,因此convert需要Car.class, 并在基类中TModel表示Car(无论如何对于这个具体的 BaseConverter ),我试图TModel.class在基类中使用,但如上所述,它不起作用。

那么如何在 Java 中实现这一点呢?

java generics class

6
推荐指数
1
解决办法
1万
查看次数

泛型:获取实例的名称

我有一个方法返回一个List<Property<?>>.

属性是具有一个通用参数的类型:

public class Property<T extends Comparable<T>> { ... }
Run Code Online (Sandbox Code Playgroud)

有一个混合类型属性的列表,我不知道具体元素具有什么类型参数.

我想做那样的事情:

List<Property<?>> list = getList();
for(Property<?> crt : list)
{
    PropertyWrapper<?> crtWrapper = new PropertyWrapper(crt.getGenericType());
    //                        I know this doesn't exist ----^
}
Run Code Online (Sandbox Code Playgroud)

在一句话中:我需要PropertyWrapper具有与当前相同的通用模板参数Property.有没有办法做到这一点?

我可以应用/sf/answers/240655131/中所述的建议,但即使我这样做,如何实现适当的,PropertyWrapper<XXX>然后只有一个实例Class<T>

Property<?>如果需要,我可以修改.我也不介意是否需要使用反射(我认为它需要)


编辑:我忘记了什么.事实上,我无法通过线路实现包装

PropertyWrapper<?> crtWrapper = new PropertyWrapper(crt.getGenericType());
Run Code Online (Sandbox Code Playgroud)

因为我有专门的子类(PropertyWrapper_String).

现在我看到两种可能性:

1:按字符串对类进行Instanciate:

String strGenericType = "";
Class<?> wrapperClass = Class.forName("PropertyWrapper_" + strGenericType);
Run Code Online (Sandbox Code Playgroud)

2:有没有办法在不创建子类的情况下专门化泛型类?


非常感谢您的提示

java generics type-erasure

5
推荐指数
2
解决办法
833
查看次数

如何从java中的Vector <T>获取T类

我写了这段代码:

public static <T> void getList(Vector<T> result){
    System.out.println(result.getClass().getName());
}
Run Code Online (Sandbox Code Playgroud)

我想写出类名T,但我无法得到它.我怎样才能做到这一点?

java generics methods

5
推荐指数
1
解决办法
1553
查看次数

如何在java泛型中返回类对象“类型”?

想象一下有一个java类

public class FixedClassOfStrings {

  List<String> myMember=new ArrayList<String>();

  // omissed all non relevant code...

  public Class getMyType() {
    return String.class;
  }
}
Run Code Online (Sandbox Code Playgroud)

如何通过使用 java 泛型使其参数化?

我的尝试失败了:

public class GenericClass<T> {

  List<T> myMember=new ArrayList<T>();

  public Class getMyType() {
    return T.class; // this gives "Illegal class literal for the type parameter T"
  }
}
Run Code Online (Sandbox Code Playgroud)

另外,如何避免在 FixedClassOsStrings 中发出警告:“类是原始类型。对泛型类的引用应该参数化”?可以声明:

  public Class<String> getMyType() {
    return String.class;
  }
  ...
Run Code Online (Sandbox Code Playgroud)

如果没问题,我应该使用泛型返回什么?

  public Class<T> getMyType() {
    return T.class; // this gives "Illegal class literal for the type parameter …
Run Code Online (Sandbox Code Playgroud)

java generics types return class

5
推荐指数
1
解决办法
4万
查看次数

如何用泛型实现Hibernate DAO

我已经找到了一些关于如何使用泛型构建Hibernate DAO的教程,但它们都使用EntityManager而不是使用SessionFactory.我的问题是如何使用泛型构建DAO SessionFactory.到目前为止我有以下内容:

接口:

public interface GenericDao<T> {

    public void save(T obj);
    public void update(T obj);
    public void delete(T obj);
    public T findById(long id);
}
Run Code Online (Sandbox Code Playgroud)

类:

@Repository
public class GenericDaoImpl<T> implements GenericDao<T> {

    @Autowired
    private SessionFactory sessionFactory;

    public void save(T obj) {
        Session session = sessionFactory.openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            session.save(obj);
            tx.commit();
        } catch (HibernateException e) {
            if(tx != null)
                tx.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }

    }

    public void …
Run Code Online (Sandbox Code Playgroud)

java generics spring dao hibernate

5
推荐指数
1
解决办法
2493
查看次数

如何检索参数化类的类

请考虑以下代码:

public class Context {
    private final Class<?> clazz;
    private final String resource;
    private final com.thirdparty.Context context;

    public Context(final String resource, final Class<?> clazz) {
        this.clazz = clazz;
        this.resource = resource;
        this.context = com.thirdparty.Context.newInstance(this.clazz);
    }

    public String marshall(final Object element) {
        return this.context.marshall(element);
    }

    public Object unmarshall(final String element) {
        return this.context.unmarshall(element);
    }
}
Context context = new Context("request.xsd", Request.class);

// Marshall
Request request = new Request();
String xml = context.marshall(request);

// Unmarshall
Request roundTrip = Request.cast(context.unmarshall(xml));
Run Code Online (Sandbox Code Playgroud)

我试图用泛类版本的Context类替换它:

public class …
Run Code Online (Sandbox Code Playgroud)

java generics

5
推荐指数
1
解决办法
76
查看次数

如何从泛型方法param获取java类?

我尝试使用下一个方法:

fun <T> put(value: T){
    val clazz = T::class.java
}
Run Code Online (Sandbox Code Playgroud)

但有例外 Kotlin: Only classes are allowed on the left hand side of a class literal

如何从泛型参数获取类?

除了类之外还有哪些其他选项可以作为参数传递?

generics kotlin

4
推荐指数
1
解决办法
1540
查看次数

误解的Java泛型

我在代码中面临一个令人困惑的问题。

我有一种方法是签名

public <T extends Measure> void sendNewMeasure(Class<T> type, T measure);
Run Code Online (Sandbox Code Playgroud)

在另一个类中,我有此方法,该方法调用上一个方法:

public <T extends Measure> void onNewMeasure(NewMeasureEvent<T> event) {
    T measure = event.getMeasure();

    APIInterface.getInstance().sendNewMeasure(measure.getClass(), measure);
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是Wrong argument type, found 'T', required <? extends com.blablabla.Measure>但我不明白为什么,因为测量对象的类型为T,扩展了Measure。

有什么办法可以解决此问题,最重要的是,为什么它不起作用?

谢谢 !

编辑:

这是sendNewMeasure方法的实现:

public <T extends Measure> void sendNewMeasure(Class<T> type, T measure) {
    String measureType = measure.getJSONMeasureTypeName();

    List<T> measures = T.find(type, measure.timestamp, true, false);

    measures.add(measure);
    sendMeasures(siteId, sensorId, measureType, measures);
}
Run Code Online (Sandbox Code Playgroud)

编辑2:这是find方法签名,我无法更改:

public static <T> List<T> find(Class<T> type, int timestamp, boolean …
Run Code Online (Sandbox Code Playgroud)

java generics

3
推荐指数
1
解决办法
1287
查看次数

将通用 POJO 写入 CSV 转换器

我的用例是编写一个通用的 CSV 转换器,它应该能够将任何 Java POJO 转换为 CSV 字符串。

我的实现:

public <T> List<String> convertToString(List<T> objectList) {

        List<String> stringList = new ArrayList<>();
        char delimiter = ',';
        char quote = '"';
        String lineSep = "\n";

        CsvMapper mapper = new CsvMapper();
        CsvSchema schema = mapper.schemaFor(!HOW_TO!);

        for (T object : objectList) {

            try {
                String csv = mapper.writer(schema
                        .withColumnSeparator(delimiter)
                        .withQuoteChar(quote)
                        .withLineSeparator(lineSep)).writeValueAsString(object);

            } catch (JsonProcessingException e) {

                System.out.println(e);
            }
        }

        return stringList;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 Jackson-dataformat-csv 库,但我坚持使用 !HOW_TO!部分,即如何从objectList中提取对象的.class。我正在学习并遇到了类型擦除,所以我认为除了将 .class 作为我的函数的参数之外,这是不可能的。但我也使用 Java 反射从通用实体中提取此对象列表,因此我无法选择提供 .class 参数。

有解决方法吗?

或者

我可以转换具有 …

java csv generics jackson-dataformat-csv amazon-kinesis-firehose

2
推荐指数
1
解决办法
1万
查看次数

如何获得泛型类的类?

我正在尝试通过JAXB创建一个用于去/序列化的泛型类.在创建JAXBContext类时必须传入,但当然使用泛型类,这是事先不知道的.

所以当我尝试这个时,我当然会得到一个编译错误.

public class ServerSerializing<T>
{
    private JAXBContext mJAXBContext = null;

    public JAXBContext getJAXBContext()
    {
        if(mJAXBContext == null)
            mJAXBContext = JAXBContext.newInstance(T.class);

        return mJAXBContext;
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是:

 Illegal class literal for the type parameter T
Run Code Online (Sandbox Code Playgroud)

那么通过通用方法可以做到这一点吗?

java jaxb2

0
推荐指数
1
解决办法
319
查看次数