繁体   English   中英

基本的Java类型转换问题

[英]Basic Java type casting issue

我有一个名为DataHandler的接口,其中包括以下声明:

public List<Object> getIt();

而ProjectSet类实现此接口。

此类处理Project对象,并且ProjectSet类的getIt()方法的实现应返回Project列表,例如:

List<Project>

如何用Java做到这一点?

问候,杰拉德

您可以通过在接口中将方法声明为以下方式来利用Java中泛型

public interface DataHandler<T> { 
    public List<T> getIt();
} 

这意味着DataHandler接口绑定到特定的未知类型T getIt()方法返回该类TList 换句话说,可以将其视为DataHandler将处理类T对象

然后提供您的实现,指定ProjectSet将是一个处理Project对象的DataHandler

public class ProjectSet implements DataHandler<Project> { 

     public List<Project> getIt() { }
} 

您可能会发现Java教程的这一课很有用。

public List<T> getIt();

在您的界面中

像这样

public interface MyInterface<T> {

  public List<T> getIt();

}

然后用

implements MyInterface<Project>

您不能以这种方式在Java中执行此操作。

我的解决方案是让数据处理程序通用

public interface DataHandler<T> {
     public List<T> getIt();
}

那你就可以

public ProjectSet implements DataHandler<Project> {
     public List<Project> getIt() { ... }
}

您有3种选择:

将接口更改为通用:

interface DataHandler<T> {

    List<T> getIt();

}

class ProjectSet implements DataHandle<Project> {

    List<Project> getIt() {
         ...
    }
 }

这很困难,因为您需要更改接口,并重构所有实现DataHandler类。 这一些丁香是不可取的。

投放清单

列表的类型信息在运行时消失了,为此,所有List类型在运行时都等于,并且等于Object,因此可以执行以下操作:

class ProjectSet implements DataHandle {

    List<Object> getIt() {
         ...

         return (List) projectList;
    }
 }

@SuppressWarnings("unchecked") ,但是行得通!,您可以添加@SuppressWarnings("unchecked")来跳过警告。

创建对象列表

class ProjectSet implements DataHandle {

    List<Object> getIt() {

         List<Object> retObject = ... ;

         for (Project p : getProjects()) {
                retObject.add(p);
         }

         return retObject;
    }
 }

这只是丑陋!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM