簡體   English   中英

Java,通用類型的常用接口 - 糟糕的設計?

[英]Java, Usual interfaces for Generic types - a bad design?

我有一個通常的接口(我不想通用)與泛型方法Get和一個實現它的泛型類。

@Override沒有給我一個警告,代碼按預期工作,但我在Foo#Get()中有一個警告: Type safety: The return type T for Get() from the type Test.Foo<T> needs unchecked conversion to conform to TT from the type Test.Attribute

我必須使Attribute接口通用嗎? 我試圖避免手動搞亂對象和強制轉換,並將所有類型的不同屬性存儲在列表中。

(使用static只是為了在一個文件中編譯測試樣本 - 它不會改變任何東西)

import java.util.ArrayList;
import java.util.List;

public class Test
{
    static interface Attribute
    {
        <TT> TT Get();
    }

    static class Foo<T> implements Attribute
    {
        T val;

        public Foo(T val)
        {
            this.val = val;
        }

        @Override
        public T Get()
        {
            System.out.println("it is me");

            return val;
        }
    }


    public static void main(String[] args)
    {
        List<Attribute> list = new ArrayList<Attribute>();

        list.add(new Foo<String>("test"));

        String s = list.get(0).Get();

        System.out.println(s);
    }
}

為了在不進行轉換的情況下使用接口,您需要使接口通用。

import java.util.ArrayList;
import java.util.List;

public class Test
{
    static interface Attribute<E> //Added Generic Param
    {
        <E> E Get();
    }

    static class Foo<T> implements Attribute<T> //Added Generic Param
    {
        T val;

        public Foo(T val)
        {
            this.val = val;
        }

        @Override
        public T Get()
        {
            System.out.println("it is me");

            return val;
        }
    }


    public static void main(String[] args)
    {
        //Specify Type of generic
        List<Attribute<String>> list = new ArrayList<Attribute<String>>(); 

        list.add(new Foo<String>("test"));

        String s = list.get(0).Get();

        System.out.println(s);
    }
}

基類中泛型方法的問題是有人可以用顯式類型參數調用它。 這顯然在這里毫無意義,這就是編譯器抱怨的原因。

似乎最好的解決方案是使您的基類通用。 如果要在列表中存儲不同類型的屬性,則會出現其他問題; 你將如何回到原始類型(無論你是否使用泛型)?

您可以使Attribute接口通用,然后使用通配符允許任何類型的Attribute放在List

List<Attribute<?>> list = new ArrayList<Attribute<?>>();

如果您需要確保每個類型只能放置一個Attribute ,只需使用Set

Set<Attribute<?>> set = new HashSet<Attribute<?>>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM