在JLS的哪个位置解释它是合法的,将原始类型分配给无界类型?

时间:2016-01-13 01:48:38

标签: java generics jls

我正在寻找以下句子的JLS引用是合法的:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
           os.path.join(BASE_DIR,'templates'),
        ],
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            'loaders':[
                    'django.template.loaders.filesystem.Loader',
                    'django.template.loaders.app_directories.Loader'
            ]
        },
    },
]

2 个答案:

答案 0 :(得分:4)

这是给你的引用(4.8. Raw Types):

  

来自未经检查的转化的警告涵盖双重案例,其中普通消费者使用旧版库。例如,库的方法具有原始返回类型Vector,但是使用者将方法调用的结果分配给Vector< String>类型的变量。这是不安全的,因为原始向量可能具有与String不同的元素类型,但仍允许使用未经检查的转换以启用与旧代码的接口。来自未经检查的转换的警告表明,普通消费者可能会遇到程序中其他点的堆污染问题。

所以你得到

的警告(不是错误!)
Vector<String> vector = PreJava5API.getRawVector();

这是为了促进与遗留代码的互操作性。

更安全的版本是使用通配符(如您的示例所示)。有了这些,你在如何使用vector方面受到严重限制,从而使它变得安全,甚至不再需要警告了:你所能做的就是拉出Object(总是如此)作品)。您无法向vector添加任何内容(因此该部分也是安全的)。

答案 1 :(得分:1)

您可以从有关作业的部分开始

https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.26.1

允许分配转换

https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.2

允许未经检查的转化

https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.9

允许从原始## ggplot # Use rsm package to create surface model. library(rsm) SurfMod <- contour(fit, y_disp ~ x_wt) # extract list values from rsm Surface Model Xvals <- SurfMod$`x_wt ~ y_disp`[1] Yvals <- SurfMod$`x_wt ~ y_disp`[2] Zvals <- SurfMod$`x_wt ~ y_disp`[3] # Construct matrix with col and row names SurfMatrix <- Zvals$z colnames(SurfMatrix) <- Yvals$y rownames(SurfMatrix) <- Xvals$x # Convert matrix to data frame library(reshape2) SurfDF <- melt(SurfMatrix) library(ggplot2) gg <- ggplot(data = SurfDF) + geom_tile(data = SurfDF, aes(Var1, Var2,z = value, fill = value)) + stat_contour(data = SurfDF, aes(Var1, Var2, z = value, color = ..level..)) + scale_colour_gradient(low = "green", high = "red") + geom_point(data = DATA, aes(wt, disp, z = mpg, color = mpg)) + geom_text(data = DATA, aes(wt, disp,label=mpg),hjust=0, vjust=0) + scale_fill_continuous(name="mpg") + xlab("x_wt") + ylab("y_disp") library(directlabels) direct.label.ggplot(gg, "angled.endpoints") 转换为G,而不会发出警告。