当前位置:  开发笔记 > 编程语言 > 正文

我该怎么做这个java通用演员?

如何解决《我该怎么做这个java通用演员?》经验,为你挑选了3个好方法。

我该怎么做这个java通用演员?

public interface IField {

}


class Field implements IField { // package private class

}

public class Form {
  private List fields;


  public List getFields() {
    return this.fields;

  }

}

return语句会抛出一个编译错误(我知道原因 - 我读过泛型教程),但编写这样的代码会非常方便.

如果我将"fields"声明为List,则需要在Form类的其他方法中对Field使用大量的强制转换.

我可以强制该死的编译器弯曲它的规则并编译返回语句吗?

提前致谢.



1> Jon Skeet..:

更好的解决方案IMO是更改方法的签名以使用有界通配符:

public List getFields()

这将让调用者将列表中的任何内容视为IField,但它不会让调用者在列表中添加任何内容(没有强制转换或警告),因为他们不知道"真实"类型是什么列表是.



2> 小智..:

碰巧,你可以,因为Java泛型只是嫁接,而不是类型系统的一部分.

你可以做

return (List)(Object)this.fields;

因为所有List对象都是相同的底层类型.

请记住,这允许任何人IField在列表中放置任何类型的实现,因此如果您的集合不是只读的,则可能会遇到困难.



3> David Rodríg..:

不要这样做.

A List不是List.您可以尝试强制编译器接受(我认为这是不可能的,我希望它不可能),但这会让您陷入困境.编译器将允许用户将从IField派生的AnotherField引入到给定的List中,从而破坏不变量,并打破泛型提供的类型安全性.稍后使用Listwill会因为奇怪元素的提取而无法将隐式强制转换为Field,而您不会期望它发生.

如果你确实需要返回a List而不是List,那么我建议生成一个填充了相同元素的新列表.如果您可以修改您的界面,请转到Jon Skeets解决方案.

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有